精华内容
下载资源
问答
  • 在 App 中定义了这个方法,赵四在下载下来照片后这个照片会被临时复制到一个目录当中,防止被系统删除: - (void)handleIncomingFile:(NSURL *)incomingResourceURL withName:(NSString *)name from:(NSString *)...

    Python实战社群

    Java实战社群

    长按识别下方二维码,按需求添加

    扫码关注添加客服

    进Python社群▲

    扫码关注添加客服

    进Java社群

    作者:keenleopard, 学生时代搞量子计算,现在在字节跳动平台架构部搞 iOS 架构

    Sessions: https://developer.apple.com/videos/play/wwdc2020/10189/

    背景

    安全风险也是一种 bug,是一个比较大的 topic,通常比较难发现,但会产生比较严重的影响。本次技术分享意图通过一些基本的概念和例子来初步探讨怎么样在开发过程中规避风险。

    基本哲学 - Threat Modeling(威胁建模,TM)

    「威胁建模(TM)」是风险管理中的一个概念,指的是寻找系统潜在的威胁,在这种威胁的基础上添加对抗的策略。通常可以从三个方向入手:

    • 攻击者导向 Attacker-centric:假设你是一个攻击者,比如用户的朋友或者网络请求的中间人,去攻击用户数据

    • 系统导向(或软件导向)System/Software-centric:从软件的设计模式出发,寻找各个模块之间不合理的地方,这方面做的比较好的例子是微软的 SDLC

    • 资产导向 Asset-centric:从用户本地数据/服务端数据出发,寻求突破点。

    对于客户端 RD 来说,我们可以把这些理念应用于:

    • 新开发产品/新需求的时候

    • 解决已成型产品的问题

    比如说,我们为奶茶爱好者开发了一个新的 App,名字叫 LooseLeaf,支持以下功能

    • 和朋友分享喝茶

    • 上传照片、视频,甚至直播茶道、茶文化

    • 建立圈子文化,有兴趣小组和群聊功能

    • 点评点心、饼干

    • 提供推荐和对比

    (实际上,这些是不是很多产品的形态?)

    那么,在搭建这个产品的时候,我们怎么把 TM 包含进来呢?

    比如说,对 App 来说,很关键的一个概念是 Assets(资产),这里不仅仅指的是 Xcode 里面的那个 Asset Catelog 里面的资源,更重要的是用户的信任。所有需要用户授权 App 才能获取的内容都是 Assets,比如相机/麦克风的使用、地理位置信息、联系人信息、好友列表、文件等,App 需要履行保护这些 Assets 的责任。初此之外,用户的观点、评价等信息也是非常重要的 Asset。

    典型的攻击方包括:

    • 违法行为如诈骗

    • 竞争对手

    • 服务提供商

    • 主权国家

    • 伴侣

    • 家人和朋友

    作为开发者,我们要问自己的问题是,针对不同种类的攻击方,我们怎么保护资产?这些攻击方有着不同程度的资产接触能力,比如通过获取硬件,或者通过共享的账号。

    作为 RD 来说,我们可能不太关心谁是攻击者,而更关心攻击者的手段。为了更好的管理数据,一个比较好的手段是建立数据流(Data Flow Diagram)。

    比如这个 Loose Leaf 的可能用到的数据包括:

    • 用户上传到LooseLeaf网站或者icloud的数据,比如账号信息、PUGC内容

    • 缓存下来的远端的数据(通常这部分会被用作本地持久化)

    • 用户授权的相机、麦克风、地理位置等系统权限

    • Schema,从而可以通过网站或者其他App打开我们的App

    在这个 Data Flow Diagram 的基础上,我们需要明确在系统中明确一个「安全墙」。这个是我们的一个出发点,它需要贯穿我们所有的需求开发当中,因为它告诉我们可以做什么、有什么数据我们不能相信,以及需要做什么。

    怎么样确认「安全墙」呢?

    我们可以问自己一个问题:攻击者可以在哪里、通过什么样的方式影响我们的App,他们能获取什么样的数据。比如上面的例子中,以下几个地方都应该有安全墙:

    • 系统文件与 App 之间

    • schma 携带的数据

    • App 与远端或者 iCloud 之间

    针对每个安全墙,都要从架构层面考虑合理的对抗方式,比如在网络通信层面使用 AppTransportSecurity。我们需要考虑怎么样更安全地在本地或者服务端存储数据。总的来说,我们应该选择可以方便解析的数据格式,plist 或者 json 都是比较好的格式,可以在灵活性与安全性之间得到平衡。我们应该采用那些可以做 schema 校验的格式,因为它们支持强类型校验和中心逻辑。

    上面这个图中,我们并没有在 App 与缓存的数据之间建立安全墙。这里的原因是,我们应当在存储数据的时候就做了安全校验,因此所有本地存储的数据是可以被信任的。对于 iOS App 而言,这一点是得到保证的,因为它的本地文件不能被其他的 App 更改。但是对于 MacOS 的 App 而言,事情确不是这样的。因此作为开发者,如果要适配 MacOS,也需要考虑怎么样在 Mac 上保护本地文件。

    我们在开发软件的时候经常要使用三方库,在这个过程中需要考虑三方库的安全隐私条款是否与我们 App 匹配,以及是否可以快速检测出不匹配的场景。

    基本的思路理清之后,我们可以应用在代码层面。比如在 Loose Leaf 中,使用 MVC 的设计模式可以有三种不同功能的 class:

    • 负责从外部(包含远端、本地、系统)中得到数据(黄色)

    • 负责解析数据并转换成 Model(红色)

    • 负责将数据展示成 UI(绿色)

    我们需要理清楚每个类的功能是什么样的,哪里具有高风险。

    存储在远端的数据是最高风险的地方之一,因为上传到 Loose Leaf 网站的数据可以被攻击者任意创造。

    我们顺着 data flow,可以根据风险来建立不同级别的 risk profile:

    不同级别的风险:红色标示风险最高,绿色标示风险最低。

    总结:在威胁建模(TM)中,开发者需要注意这几点:

    • 明确你的系统的数据资产

    • 从架构层面考虑风险规避,包括传输和存储,例如

      • 网络通信

      • 本地存储

      • 三方库的依赖

    • 确认哪些数据是高风险的、不可信任的、可以被攻击者控制的

    • 根据data flow来追踪这些风险数据,从而确认出系统中的哪些高风险组件

    怎么样找到不可信的数据

    明确什么样的数据是不可信的是提升我们 App

    全性的第一步。怎么样知道哪些数据是不可信的呢?

    答案:

    • 所有我们不能掌控的、来自于外部的数据都应该被当作不可信数据

    • 如果你不知道是否能掌控某个数据,那么就当作不能掌控。记住,总要做最坏假设!

    举个例子,Loose Leaf 使用了自定义的 URL handler,那么传过来的 URL 就完全不是可以信任的。用户可以通过各种途径(比如朋友发来的微信)来获取到这样的 URL:looseleaf://invite?payload=aW5zZXJQ3ONGHwdlMV9kYm94。类似的,如果你的 App 支持一些自定义的格式,那么传来的文件也可能攻击你的 App。

    最典型的一个场景是来源于网络,这种包括

    • HTTPS 或者 WebSocket

    • P2P通信(如视频通话)

    • 蓝牙传输

    一些常见的 Anti-Patterns

    在理清什么样的数据不可信任之后,我们列举出一些典型的错误代表,看看开发过程中经常遇到的错误。

    Path Traversal 路径遍历

    (比如iOS广泛使用的SSZipArchive, github issue[1]

    比如在 Loose Leaf 这个 App 中,我们开发了一个照片分享的功能:刘能可以把奶茶照片发给他的朋友赵四。在 App 中定义了这个方法,赵四在下载下来照片后这个照片会被临时复制到一个目录当中,防止被系统删除:

    - (void)handleIncomingFile:(NSURL *)incomingResourceURL
                      withName:(NSString *)name
                          from:(NSString *)fromID {
        NSURL *destinationFileURL = [NSURL fileURLWithPath:[NSTemporaryDirectory() stringByAppendingPathComponent:name]];
        
        NSError *err = nil;
        [[NSFileManager defaultManager] copyItemAtURL:incomingResourceURL
                                                toURL:destinationFileURL
                                                error:&err];
    }
    

    上面这种写法有什么问题?三个入参中哪些是不可信的?

    incomingResourceURL是下载图片的时候赵四的手机本地生成的一个URL,不会被刘能的手机控制,因此是可信的;

    fromID是用户id,也是可信的;

    name则完全是刘能掌控的一个字符串,它可以是一个普通的名字如“村头的喜茶”,但也可以是任意的字符串,因此是不可信的。比如name可以是../../Library/Foo/,在这种情况下,上面代码段的第四行就变成了

    NSURL *destinationFileURL = [NSURL filewithPath:@"/var/mobile/Containers/Data/A123/tmp/../../Library/Foo/"]

    因此刘能可以控制自己的照片被拷贝到赵四手机这个App的沙盒目录的任何地方,后果会非常严重,因为沙盒中的一些敏感的数据可能被改写。

    怎么样规避这个问题呢?如果使用name.lastPathCompanent来替换第四行:

    [NSURL fileURLwithPath:NSTemporaryDirectory() stringByAppendingPathComponent:name.lastPathCompanent],在上面这个例子中还可以,但是lastPastCompanent依然可能会出现类似于..这种bad case,所以也是有问题的。

    所以需要在上面这个函数一开始的时候做一些bad case的过滤:

    NSString *safeFileName = name.lastPathComponent;
    if (safeFileName.length == 0 ||
        [safeFileName isEqualToString: @".."] ||
        [safeFileName isEqualToString:@"."] ) {
        return;
    }
    

    如果是swift项目的话,通过guard来实现更简洁一些:

    guard
        case let safePath = name.lastPathComponent,
        safePath.count > 0,
        safePath != "..",
        safePath != "."
    else { return }
    

    因此,在filePath中尽量不要不可控的或者远端传来的参数,而使用本地随机生成的参数。如果必须要使用的话,过滤出lastPathComponent并做数据校验和数据清洗。此外,也需要使用fileURLWithPath:从而防止 percentage encoding attack。

    作为客户端 RD,现在就可以检查你是否在使用下面这些API的时候在路径中传入了不可信任的字符串:

    - appendingPathComponent:
    - pathWithComponents:
    - fileURLWithPathComponents:
    - URLByAppendingPathComponent
    

    不可信的 format strings

    比如远端往一个设备上发了一个请求,然后这个请求在本地解析一下发个响应回去,一个简单的例子:

    - (NSString *)generateResponseFromRequest:(NSString *)requestFormat withName:(NSString *)name {
        NSString *formatStringKey = requestFormat ?: @"%@ sent a response";
        NSString *localizedFormatString = [NSString localizedStringWithFormat:formatStringKey, name];
        return localizedFormatString;
    }
    

    两个参数中,name是本地的一个变量,是可信的;而requestFormat是远端传入参数,因此是不可信的。假如传入的requestFormat = @"%@ leaked some memory %lx%lx%lx%lx%lx",那么第三行就变成了这个样子[NSString localizedStringWithFormat:@"%@ leaked some memory %lx%lx%lx%lx%lx", @"Jack"];

    没有足够的变量用于解析Format,造成了溢出,实际输出的将是:

    Jack leaked some memory cbd4309b6142d3d1418c1915116b5b32a28e7ecfa630245f
    

    因此需要注意的是:

    • 计量不要直接把远端的数据当作 format string

    • 确保编译 flag -Wformat-security 是打开的(默认是开的),但是上面这个 case 它检测不出来,能检测出来的是这种 case:

    static void foo(const char *input) {
        printf(input);        //warning: format string is not a string literal (potentially insecure)
    }
    
    • 在Swift中不要使用format string,要使用string interpolation

    现在就可以检测一下在下面这些API当中是否传入了不可信任的string:

    +[NSString stringWithFormat:]
    -[NSMutableString appendFormat:]
    +[NSPredicate predicateWithFormat:]
    +[NSException raist:format:]
    CFStringCreateWithFormat
    CFStringAppendFormat
    printf
    os_log
    

    更难发现的例子:State corruption

    比如刘能邀请赵四参加一个线上直播的session,刘能发出邀请后等待赵四接受邀请,赵四接受邀请之后告诉刘能,正常情况下时序图是这样的:

    那刘能在发出邀请之后如果再发了一个接受邀请给赵四,是不是就可以强制双方建立联系了:

    比如说我有一个StateManager用来根据通信内容管理用户的状态:

    //StateManager.h
    @interface StateManager : NSObject
    
    - (void)handleMessage:(RemoteMessage *)message from:(NSString *)fromID;
    
    @end
    
    //StateManager.m
    @interface StateManager ()
    @property (nonatomic, strong) NSDictionary<NSString *, Session*> *sessions;
    @end
    
    @implementation StateManager
    
    //这个函数根据传过来的message的类型做了不同的处理
    - (void)handleMessage:(RemoteMessage *)message from:(NSString *)fromID {
        switch (message.type) {
            case RemoteMessageInvite:
                [self handleSessionInviteWith:message from:fromID];
                break;
            case RemoteMessageInviteAccept:
                [self handleSessionInviteAcceptedWith:message from:fromID];
                break;
            case RemoteMessageEnd:
                [self handleMessageDisconnectedWith:message from:fromID];
                break;
            default:
                break;
        }
    }
    
    //当message.type是accept的时候会走到这个函数
    - (void)handleSessionInviteAcceptedWith:(RemoteMessage *)message from:(NSString *)fromID {
        Session *session = [self.sessions objectForKey:message.sessionIdentifier];
        if (!session) {
            return;
        }
        
        session.state = SessionStateConnected;
        [session setupSocket];
        
    }
    
    @end
    

    这么写有什么问题?message 是其他用户传过来的一个消息,这个是不可控、不可信的。会出现上面图中的情况,因此需要在获取 session 之后补充对 session 的校验:

    if (session.state != SessionStateInviting) {
        return;
    }
    

    此外,需要确保fromID是我们这个session中发出去的:

    if (![session.invitedFromIDs containsObject:fromID]) {
        return;
    }
    

    从这个例子中我们学到什么?

    • 在实现一个方法的时候要明确这个类或者实例当中要满足什么样的条件(比如一些不等式)

    • 通常这些不等式可能很微妙,容易出错

    • 尤其要对那些你所不期待的或无法控制的参数格外敏感,提早发现问题,从而规避风险。

    数据混淆

    比如说我们经常遇到这样的场景:

    服务端给了我们一些Json数据,本地解析成一个字典,然后在字典中添加一些本地的KV,这个字典用于更改UI或者数据库,那么数据流和安全墙大概是这个样子:

    // Reaction.h
    
    @interface Reaction : JSONModel
    
    @property (nonatomic, strong) NSString *reactionType;
    @property (nonatomic, strong) NSString<Optional> *imageURL;
    @property (nonatomic, strong) ReactionImageData<Optional> *imageData;
    
    @end
    
    // MessageManager
    - (void)didReceiveReactionData:(NSData *)data {
        NSError *err = nil;
        Reaction *reaction = [[Reaction alloc] initWithData:data error:&err];
        if (reaction.imageData) {
            NSURL *tmpURL = [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:NSUUID.UUID.UUIDString];
            [reaction.imageData writeToURL:tmpURL];
            reaction.imageURL = tmpURL;
        }
        
        if (!err) {
            [self.liveSreamVC displayReaction:reaction];
        }
    }
    
    // LiveStreamController.m
    - (void)displayReaction:(Reaction *)reaction {
        // some implementation ...
        NSURL *imageURL = reaction.imageURL;
        if (imageURL) {
            // some implementation ...
            [[NSFileManager defaultManager] removeItemAtURL:imageURL error:nil];
            
        }
    }
    

    这样写有什么问题?

    加入传入的json已经包含了一个imageURL,那么可以用这样的代码删除沙盒中的任意文件!

    {
        "reaction_type": "thumbs-type"
        "image_url": "file:///var/mobile/foo/database.db"
    }
    

    怎么样规避这种问题?

    • 区分开可以信任的数据和不可信任的数据,把他们放到不同的对象当中,否则在使用这个对象的时候就会有歧义。

    • 确保不可信任的数据做了充足的校验

    总结

    但愿通过上面的一些基本概念和代码快,你可以知道怎么样对待安全问题。安全是一个很大的Topic,而且通常一个很小的代码错误会导致很大的问题,作为开发者,要时刻注意下面这几点:

    • 定位到攻击者可以在哪里影响你的数据流

    • 完善设计模式,从而可以减少风险

    • 对于一些常见的Anti-Pattern要有足够的认知,知道如何处理

    • 对于不可信任的数据,要格外注意

    参考资料

    [1]

    github issue: https://github.com/ZipArchive/ZipArchive/issues/453

    程序员专栏 扫码关注填加客服 长按识别下方二维码进群
    
    

    近期精彩内容推荐:  

     为何说IT科技公司应该留住35岁员工?

     工友们!大家好,今天你摸鱼了吗?

     缓存穿透,雪崩,击穿以及解决方案分析

     图文详解:如何给女朋友解释什么是微服务?


    在看点这里好文分享给更多人↓↓

    展开全文
  • 问题:若有下列共用体定义:union utepy{int i;char ch;}temp;当执行\\\"temp.i=266;\\\"语句后,temp.ch的值是更多相关问题三级跳远由()的连续三次跳跃组成。白炽灯的灯头可分为插口式和螺口式二种。耐久跑中的...

    问题:若有下列共用体定义:

    union utepy

    {int i;

    char ch;

    }temp;

    当执行\\\"temp.i=266;\\\"语句后,temp.ch的值是

    更多相关问题

    三级跳远由()的连续三次跳跃组成。

    白炽灯的灯头可分为插口式和螺口式二种。

    耐久跑中的途中跑要求()相配合。

    由一列横队变成二列横队时应先()报数。

    采用发行股票方式筹集公路工程建设资金可以()。A.降低企业的负债比率B.使企业少缴部分所得税C.提

    对大型桥墩混凝土浇筑工程的计量应采取的计量方法是()。A.凭证法B.断面法C.分项计量法D.均摊法

    在建安工程造价中,材料预算价格是指材料由其来源地运到()的价格。A.施工工地B.使企业少缴部分所得

    以平面直角坐标系的原点为极点,x轴的正半轴为极轴并取相同的长度单位建立极坐标系,若直线ρcos(θ-π4)=2与曲

    选修4-4:坐标系与参数方程.已知曲线C的极坐标方程为ρ=4cosθsin2θ,直线l的参数方程为x=tcosαy=1+tsinα(t为参

    (选修4-4:坐标与参数方程) 以直角坐标系的原点为极点,x轴正半轴为极轴,并在两种坐标系中取相同的长度单位.

    圆C:ρ=4Sinθ的圆心C到直线l:x=3+ty=3-t(t为参数)的距离为______.

    担保采用()方式的,应披露担保物的种类、数量、价值等相关情况。A.保证B.质押 C.抵押D.按

    深交所规定申购单位为()股,每一证券账户申购数量不少于()股。 A.100;100B.100;50

    询价对象应当为其管理的股票配售对象分别指定资金账户和证券账户,专门用于累计投标询

    专项复核报告供()履行审核工作职责时使用。 A.中国证监会发行监管部 B.主承销商C.

    随着青藏铁路、西气东输、西电东送、南水北调等四大工程的相继开工建设,上海市民用上新疆的天然气,

    战略联盟是一种网络式联合体,在美国也被称为“虚拟公司”,其原因主要有以下哪些?A.企业边界模糊。B.

    以下不属于设计轮流任职计划的依据的是哪项?A.通过作业轮换,替理人员将逐渐学会按照管理的原则来

    美国电话电报公司将企业的生存目的定位于提供信息沟通工具和服务而不是生产电话,说明了其所描述

    自我中心性加强为

    A.焦虑B.退化C.猜疑D.期待E.愤怒 预期要发生不良后果时的复杂情绪反应为

    A.0~3岁B.4~6岁C.3~7岁D.1~3岁E.7~11岁 人格发展关键期是

    下颌第一磨牙

    根据下列题干及选项,回答 101~104 题: 《处方管理办法》规定 A.1年B.2年 C.3年 D.5年 E.3个月

    固体制剂、半固体制剂()。

    大容量注射剂()。

    根据下列选项,回答 98~100 题: A.在一定时间间隔内生产的在规定限度内的均质产品为一批B.可由

    下列哪个不属于矫味剂()。A.润湿剂B.甜味剂C.胶浆剂D.芳香剂E.泡腾剂

    下列关于液体制剂特点的叙述错误的是()A.携带、运输、贮存方便B.易于分剂量,服用方便,特别适用于

    下列剂型的质量检查中需进行粒度检查的是()A.颗粒剂B.片剂C.胶囊剂D.酒剂E.溶液剂

    凡规定检查溶出度的胶囊剂可不进行()的检查。A.装量差异B.外观C.微生物限度D.崩解度E.含量均匀

    关于肛裂的描述错误的是A.肛尾韧带较坚硬、伸缩性差是发生肛裂的解剖因素B.齿状线附近的慢性炎症

    甲企业欠乙企业10万元,现乙企业将甲企业兼并,这种情况下,甲企业的债务消灭。()A.正确B.错误

    如果商品房预售合同没有按照法律规定办理登记手续,当事人可以请求确认该合同无效。()A.正确B.错

    甲乙双方约定采用合同书形式订立一份买卖合同,在签字、盖章之前,甲顺路将货物送到,乙方接收了货物

    四气的确定是A.从人体的感官感觉出来B.从疾病的性质中总结出来的C.从药物作用于人体所发生的反应

    在单位工程验收时出现施工质量不符合规定的情况,请问应该按什么原则进行处理?

    慰问信的正文,通常包括的内容有()。A.表示慰问B.概述事实C.表达希望D.署名和日期

    市场调查的基本方式有()。A.普查B.抽样调查C.典型调查D.重点调查

    会计软件必须具备如下初始化功能()。A. 选择会计核算方法B. 输入需要在本期进行对账的未迭账项C

    在KIS系统中,下列能够进行无痕迹修改的凭证有()。A. 已过帐的凭证B. 未审核的凭证C. 未过账的凭

    采用会计电算化软件的单位,其会计档案保管期限与手工核算时相比,应该()。A. 一致B. 有所差别C.

    关于商业银行存款说法正确的是()。 A.存款是商业银行主要的资金来源 B.存款为商业银行各职能的实现提供

    The teacher said that the earth ______ around the sun.A.turnsB.turnedC.turn

    He likes coffee very much. ______.A.Neither do IB.I like it, eitherC.So do I

    She ______ TV when I came in.A.watchedB.was watchingC.watching

    This is the right size. It ______ me very well.A.likesB.belongs toC.fits

    “我们应该反对为了组织目标而操纵个人的做法。但是,一定程度的员工的一致性确实能使组织更为有效。”你是否赞

    小明和小丽合打一份稿件.(1)两人一共完成了这份稿件的几分之几?(2)小丽比小明多打了这份稿件的几分之几?

    案例分析 西南航空面临新挑战[问题]

    粮店运进一批面粉54吨,第一天售出14吨,第二天售出15吨.两天一共售出多少吨?

    甲企业将一项专利使用权转让给乙企业,拟采用对利润分成的方法,该专利系三年前从外部购入,

    美国专业评估执业统一准则将评估报告书分为() A.完整型评估报告 B.概述型评估报告 C.限

    资源资产评估的实质是对资源资产()所获权益的本金化。 A.所有权B.经营权C.所有权与经营权

    房地产投资的风险性表现在哪里?

    已知x=-1y=3是方程2x-ay=7bx+3y=-4的解,求-5a+2b+1964的值.

    小明给小刚出了一道数学题:如果我将二元一次方程组2x-y=3x+y=3第①个方程y的系数遮住,第②个方程x的系数覆盖,

    二元一次方程组x+y=1x+2y=0的解为______.

    已知方程组2x+y=6x+2y=9,求x+y与x-y的值.

    (1)火车在笔直的铁轨上行驶,可以看作是数学中的()现象。(2)线段AB沿和它垂直的方向平移到A′B′,则线段AB和线

    收款凭证属于()。A.原始账簿B.原始凭证C.简单分录D.记账凭证

    “待处理财产损溢”账户未转销的借方余额表示()。A.等待处理的财产盘盈B.等待处理的财产

    具有真正的根、茎、叶的植物为()。 A.藻类植物 B.苔藓植物 C.菌类 D.蕨类植物

    石质路堑开挖方法有()。A.挖掘法B.钻凿法C.爆破法D.松土法E.破碎法

    路基填方压实施工中容易发生“漏压”的部位有()。A.路基两侧边沿B.靠近桥涵及其他构造物处C.填方

    路基作为承受行车荷载的构造物,应满足的基本要求有()。A.足够的强度B.足够的稳定性C.足够的平整

    某路面底基层设计要求的弯沉值为2.05mm,施工完成后各评定路面段的实测代表弯沉值如下,其中合格的

    可以办理转账结算和存入现金,但不能支取现金的是()。A.基本存款账户B.一般存款账户C.I临时存款账

    预算单价法编制施工图预算的基本步骤中不包括()。A.准备资料,熟悉施工图纸B.计算工程量C.套用消耗

    提高价值最为理想的途径是()。A.产品功能较大幅度提高,产品成本较少提高B.在产品成本不变的条件下

    建设项目最后实现的经济效果,很大程度是由()工作决定的。A.设计B.施工C.运行D.决策

    理性概括

    知识学习的三阶段中,应解决的主要心理问题分别是知识的______、保持和______。

    陈述性记忆处理陈述性知识,如()。 A.字词B.人名C.时间D.观念E.怎样骑车

    短时记忆的容量有一定的限度,其平均数量为()个组块。 A.6±2B.6±1C.7±1D.7±2

    盖特伍德和费尔德等人发现,预测新招聘员工未来工作绩效时,采用()的效度较好。A.教育背景B.个人

    公司A生产雨伞,公司B生产防晒霜。两个公司的价值都因天气情况而定,且如下表所示:每个公司发行在外

    用人单位的规章制度和重大事项决定在实施过程中,如果工会或者职工认为不适当,则()。A.应当提请

    劳动争议处理的一般程序包括()。A.协商、调解、仲裁和诉讼B.调解、投诉、仲裁和诉讼C.协商、调解、

    若有下列共用体定义:

    展开全文
  • 混沌工程:分布式系统稳定性的“疫苗”一、容灾了,但没完全容灾二、NetFlix、猴子与疫苗三.混沌工程的价值四、国内混沌工程开源项目现状1.混沌之刃—ChaosBlade2.混沌网格—Chaos Mesh五、国内混沌工程行业标准六、...

    作者:李康建 中原银行信息技术部

    一、容灾了,但没完全容灾

    2021年7月14日夜晚,B站突发宕机事故,导致服务不可用长达40分钟,B站“难民”们纷纷涌入其他竞品平台,导致了连锁性的服务雪崩事件。事故原因众说纷纭,据传可能有机房失火,停电,云设施故障,程序猿手滑等等。
    在这里插入图片描述
    且不论有多少可怜的程序猿会因为此次事故而面临祭天的命运,拨开围绕在此事件上的热点讨论,它的本质无非就是未能对生产环境突发故障做出合理的预警和未雨绸缪的预防,或者说没有对各种可能影响服务高可用性的因素做出充分考虑和应对;以至于千里之堤,溃于蚁穴。

    比较戏剧性的是,那篇《B站高可用架构实践》还在各大技术博客上优哉游哉地挂着,里面充斥着我们耳熟能详的名词:负载均衡、分布式限流、超时控制、优雅降级、故障演练等等,听上去给服务可用性叠上了一层层可靠的护甲,如同马奇诺防线一样坚不可摧,如同泰坦尼克号一样永不沉没,如同苏维埃联盟一样牢不可破。然而实践是检验真理的唯一标准,残酷的现实告诉我们,这些名词并不一定像它们看上去那样可靠。有人在文章评论区留下了这样的调侃:容灾了,但没完全容灾。

    随着微服务化、云原生、敏捷开发的快速普及,我们在快速迭代相应业务需求即时变化的同时,也面临着分布式架构复杂程度急剧上升,故障频发,强弱依赖关系难以厘清,系统变化过快稳定性难以保证等问题,这使得架构的容错性和高可用性都受到了前所未有的挑战。为此我们引入了混沌工程的概念,它是提升分布式系统架构稳定性的“疫苗”。
    在这里插入图片描述

    “一只南美洲亚马逊河流域热带雨林中的蝴蝶,偶尔扇动几下翅膀,可以在两周以后引起美国得克萨斯州的一场龙卷风”。这就是我们耳熟能详的蝴蝶效应。无独有偶,英国有这样一段著名的民谣描述国王查理三世的悲剧命运:“少了一枚铁钉,掉了一只马掌。掉了一只马掌,失去一匹战马。失去一匹战马,失去一场战役。败了一场战役,毁了一个王朝。”它们背后的原理是一致的,即初始条件的微小差异经过复杂系统的层层放大后,引起了影响深远的连锁反应。我们用混沌一词来描述这种状态,混沌是一个非线性科学概念,指确定性动力学系统因对初值敏感而表现出的不可预测的、类似随机性的运动。
    在这里插入图片描述
    应用的分布式架构体系同样可以视为一个混沌体系,浩如繁星的微服务数目,错综复杂的调用链路,海量的交易数据,这一切使得生产环境遍布着难以预测的湍流,即使是一个看似不起眼的波动,都有可能造成整个系统的雪崩。混沌工程正是为了探究与应对生产环境的混沌状态而诞生的实验学科。

    二、NetFlix、猴子与疫苗

    2008年8月, Netflix主要数据库的故障导致了三天的停机,之后Netflix工程师着手寻找替代架构,并在2011年起,逐步将系统迁移到AWS上,运行基于微服务的新型分布式架构。这种架构消除了单点故障,但也引入了新的复杂性类型,需要更加可靠和容错的系统。为此,Netflix 工程师创建了 Chaos Monkey,会随机终止在生产环境中运行的 EC2 实例。工程师可以快速了解他们正在构建的服务是否健壮,是否有足够的弹性,是否可以容忍计划外的故障。混沌工程由此发源。

    Netflix把他们的故障测试工具命名为混沌猴子,意指它会像猴子一样在系统中上蹿下跳搞破坏,以此来验证云应用的可靠性。在后续的产品更新和升级中,他们延续了这一设定,创造出了五花八门以猴子为名的新工具,组成了一支庞大的猴子家族;比如Chaos Kong、Latency Monkey、Simian Army等。

    在这里插入图片描述
    在2016年,它的前工程师创建了Gremlin,成为首个商用化的混沌工程实验平台。2017年,开源了Chaos Toolkit混沌工程实验框架。目前混沌工程的概念和落地实践已在国内外得到快速传播和推广,包括微软、谷歌、亚马逊、阿里、腾讯、字节等公司,都在以种种形式践行着混沌工程。
    在这里插入图片描述
    混沌工程的概念由Netflix最早系统化的总结提出,它的定义如下:

    混沌工程是在分布式系统上进行实验的学科,目的是建立对系统抵御生产环境中失控条件的能力以及信心。

    混沌工程是一套通过在生产分布式系统上进行实验,主动找出系统中的脆弱环节的方法学。这种通过实证的验证方法可以为我们打造更具弹性的系统,同时更透彻的掌握系统运行时的各种行为规律,树立运行高可用分布式系统的信心。

    Netflix将混沌工程的实践原则总结为五条:

    1. 建立一个围绕稳定状态行为的假说
      稳定状态是指系统正常运行时的状态。具体来说,系统的稳定状态可以通过一些指标来定义。指标可以分为系统指标和业务指标。系统指标(如CPU 负载、内存使用情况、等)有助于帮助我们诊断性能问题,有时也能帮助我们发现功能缺陷。在混沌工程中,业务指标通常比系统指标更有用。

    2. 多样化真实世界的事件
      混沌变量反映了现实世界中的事件。我们可以通过潜在影响或估计频率排定这些事件的优先级。不需要穷举所有可能对系统造成改变的事件,只需要注入那些频繁发生且影响重大的事件。任何能够破坏稳态的事件都是混沌实验中的一个潜在变量。

    3. 在生产环境中运行实验
      系统的行为会依据环境和流量模式都会有所不同。由于资源使用率变化的随时可能发生, 因此通过采集实际流量是捕获请求路径的唯一可靠方法。为了保证系统执行方式的真实性与当前部署系统的相关性, 混沌工程强烈推荐直接采用生产环境流量进行实验。

    4. 持续自动化运行实验
      手动运行实验是劳动密集型的, 最终是不可持续的。所以我们要把实验自动化并持续运行,混沌工程要在系统中构建自动化的编排和分析。应该自己投入精力来开发混沌工程的工具和平台,以期不断降低创建新实验的门槛。

    5. 最小化爆炸半径
      为了避免对生产环境造成较大程度的影响和损害,混沌工程应该采取循序渐进的推进方式,将影响范围控制在最小。需要具备随时遏制和停止实验的能力,避免对生产环境造成不可挽回的影响。
      在这里插入图片描述

    作为一个类比,我们可以把混沌工程看做打疫苗的过程。疫苗也是通过事先注入抗原引导免疫系统产生抗体,来增强人体对于特定病原体的防御能力的。这和混沌工程注入故障以未雨绸缪预防更多故障的思想是一致的。疫苗是灭活病毒,以防对人体造成真实损害;混沌工程也强调要最小化爆炸半径,避免对生产环境造成过度破坏。

    三.混沌工程的价值

    混沌工程的意义主要体现在探索和避免潜在的稳定性缺陷,检验和提升系统高可用性及容错性,提升运维故障响应修复效率等方面。 我们也可以从定量的角度来描述混沌工程的价值。从降低故障发生频率和提升应急响应效率的角度而言,主要涉及到的量化指标包括MTBF、MTTR、MTTF。

    MTTR即为平均恢复时间,是故障发生后经过修复回复正常的平均时间。可以通过发现缺失的系统监控、告警,缩短故障发现时间;以及提高技术⼈员应急效率,缩短故障解决时间来优化这一指标。

    MTTF是平均无故障时间,是故障修复到再次发生的平均时间。改善措施包括对历史故障持续进⾏回放,避免相同故障再次发⽣;对架构薄弱点持续进⾏验证,避免架构稳定性衰退。

    MTBF平均失效间隔,是两次故障发生的平均间隔。通过提升平均⽆故障时间和降低平均修复时间,可以有效提升平均失效间隔。
    在这里插入图片描述
    字节跳动在混沌工程落地实践中,用这样的公式来衡量其价值:
    A=MTBF(N-1)/[MTBF(N-1)+MTTRNS]

    其中N为故障发生次数,S为故障影响范围。通过计算平均失效间隔和平均恢复时间与故障规模之积的比例,来计量混沌工程对于故障应急能力的提升程度。

    也可以从经济成本的角度来衡量混沌工程的价值。
    在这里插入图片描述
    这是阿里计量混沌工程投入产出比的方法。投入成本主要包括混沌工程师的工资支出,安装相应软件的成本,以及运行实验的开销。收益来自于因混沌工程的实施而提前避免的运维故障造成的潜在损失,包括业务收入,员工生产率损失,故障修复成本等。

    Netflix也通过类似的方式去计算混沌工程的收益。据其技术团队统计,在混沌工程实施后的某一年中,提前暴露了2次大故障和8次小故障,避免的潜在损失大约为70万美元。相应的投入为混沌工程团队的工资,共计3人,15万美元/人,以及实验成本1万美元,投资回报率为52.17%。

    四、国内混沌工程开源项目现状

    混沌工程目前在国内的大型互联网企业已经得到了广泛的和落地实践,用于迭代改进应用架构的健壮性和韧性。业界也开源出了一批混沌工程实验工具,比较著名的是阿里开源的ChaosBlade和PingCAP研发的Chaos Mesh。此外云原生产业联盟还主导制定了混沌工程相关的行业标准。

    1.混沌之刃—ChaosBlade

    ChaosBlade是阿里内部 MonkeyKing 对外开源的项目,支持丰富多样的实验场景。涵盖基础资源、 Java 应用、C++ 应用,、Docker 容器、云原生平台、Pod 网络和 Pod 本身等实验场景。

    (1)混沌实验模型
    ChaosBlade的混沌实验模型分为四层,描述了实验的对象、范围、匹配条件以及具体操作:
    Target:实验靶点,指实验发生的组件,例如 容器、应用框架( Dubbo、Redis、Zookeeper)等。
    Scope:实验实施的范围,指具体触发实验的机器或者集群等。
    Matcher:实验规则匹配器,根据所配置的 Target,定义相关的实验匹配规则,可以配置多个。比如缓存领域的 Redis,可以根据 set、get 操作进行匹配。
    Action:指实验模拟的具体场景,Target 不同,实施的场景也不一样,比如磁盘,可以演练磁盘满,磁盘 IO 读写高,磁盘硬件故障等。
    在这里插入图片描述
    (2)ChaosBlade生态
    MonkeyKing将场景按领域实现封装成一个个单独的项目,方便场景水平和垂直扩展,通过遵循混沌实验模型,实现 ChaosBlade cli 统一调用。目前,ChaosBlade已在国内四十多家企业中登记使用,包括工商银行、浙江移动、中国电信、小米集团、携程&去哪⼉、滴滴、哔哩哔哩等。
    在这里插入图片描述

    2.混沌网格—Chaos Mesh

    Chaos Mesh是PingCAP开源的一款为k8s设计的混沌工程演练工具。使用CustomResourceDefinitions(CRD)定义混沌对象,允许针对不同类型的故障注入使用灵活且独立的CRD对象。如果添加符合现有CRD对象的故障注入方法,则可以直接基于此对象进行缩放;如果这是一种全新的方法,将为其创建一个新的CRD对象。它支持多样化的故障场景注入,包括pod类,基础资源类,网络类,文件系统类以及内核类故障。

    (1)Chaos Mesh架构
    Chaos Mesh包含三个主要组件:
    Controller-manager:它充当平台的“大脑”,管理CRD对象的生命周期并安排混乱实验,具有用于调度CRD对象实例的对象控制器。
    Chaos-daemon:作为特权daemonset运行,可以在节点和Cgroup上操作网络设备。
    Chaos Dashboard:与用户交互的Web UI,用户通过该面板制定和编排混沌实验。

    (2)Chaos Mesh运作原理
    用户使用YAML文件或Kubernetes客户端,创建或更新混乱对象到Kubernetes API服务器。Chaos Mesh使用API服务器来监视混沌对象,并通过创建,更新或删除事件来管理混沌实验的生命周期。控制器管理器,chaos-daemon和sidecar容器一起工作以注入错误。当admission-webhooks收到Pod创建请求时,将动态更新要创建的Pod对象。例如,将其注入边车容器和Pod中。
    除了专用于k8s的Chaos Mesh外,PingCAP还开源了适用于物理机环境的Chaosd;此外还提供了可用于实验及指标可视化的Grafana插件。目前Chaos Mesh在腾讯、美团、网易、小鹏汽车等众多企业得到了推广应用。
    在这里插入图片描述

    五、国内混沌工程行业标准

    混沌工程在国内方兴未艾,也在业内形成了广泛的讨论,造就了一套行业标准的雏形。由中国信通院(CNIA)牵头成立的云原生产业联盟从2020年初开始组织专家进行混沌工程技术研究,提出了应用混沌工程方法来验证云原生系统的韧性架构,将相关研究成果写入《云原生中间件白皮书(2020)》并于2020年7月可信云大会上发布,同时成立混沌工程项目组。2021年4月2日,由CNIA组织的混沌工程项目研讨会议在京召开,讨论近期工作组研究成果并发布《混沌工程测试平台能力》标准纲要。

    纲要将混沌工程平台技术架构分为五大部分:资源支持能力、故障注入类型、功能模块、上层能力以及横向支撑能力。资源支撑能力中,明确了混沌工程平台应该兼容的底层资源;故障类型对混沌工程应提供的故障注入类型进行分类;功能模块介绍了为了实现混沌实验,平台应提供实验设计、实验实施及实验度量分析三大部分能力;上层能力是规范了平台的对外输入、输出能力;横向支撑能力则就权限管理和安全审计能力进行规范。

    此外,信通院还联合多家云应用服务商成立了混沌工程实验室,旨在通过专家研讨和行业交流,明确混沌工程产业发展定位,引领产业发展方向;并集合行业内龙头企业的专业力量,整合优质资源,形成产业合力,开展技术研究,加强标准体系建设,提高混沌工程产业的发展向心力和发展质量。

    在这里插入图片描述

    六、结语

    回到最初的问题,如何才能切实有效提升复杂分布式架构的容灾能力,使其尽可能降低故障发生的频率,以及在故障发生后能够及时恢复正常,保证业务连续性?一方面,我们应该通过生产事故分析以及故障模拟演练,尽可能多地去发掘引发故障的原因和场景,对于故障原因明晰且能够修复的,应该及时加以修正;另一方面,对于故障原因随机无法确认的,应该通过相应的故障注入模拟,验证系统是否存在有效的容灾机制,防止故障影响进一步扩大,使应用能够及时恢复正常并继续提供服务;最后,在以上条件都已满足的基础上,通过大规模成体系自动化的混沌工程演练,自主探索那些我们尚未知晓,但对于系统健壮性存在潜在影响的领域。通过对于上述“已知的已知”、“已知的未知”、“未知的未知”问题的分层次探索与解决,充分运用“面向失败编程”的思想,不断完善提升应用架构的韧性和稳定性。
    在这里插入图片描述
    笔者的领导在研讨混沌工程时说过这么一句话:一个保洁阿姨不小心拔了机房的电源线,这就是混沌工程思想的最简单落地实践。不要小看这种听上去有些天方夜谭的场景,B站此次就是因为类似的简单问题而掉线。必须对各种可能的场景都充分考虑,未雨绸缪,这样才能在事故来临之际有条不紊地解决问题,才能保证《高可用架构实践》真正的在实践中高可用。

    展开全文
  • 日期时间类型4.3数据定义功能4.3.1.SQL数据定义功能4.3.2.架构基本概念4.3.3.定义架构4.3.4删除架构4.3.5定义基本表4.3.6约束列级约束表级约束六种约束示例4.3.7修改表结构示例 4.1.SQL语言概述 4.1.1.SQL语言特点 ...


    4.1.SQL语言概述

    4.1.1.SQL语言特点

    • 一体化
    • 高度非过程化
    • 简洁
    • 使用方式多样

    4.1.2.SQL语言功能

    SQL功能命令动词
    数据查询select
    数据定义create、drop、alter
    数据操纵insert、update、delete
    数据控制grant、revoke、deny

    4.2.SQL支持的数据类型

    4.2.1.数值型

    ①准确型:

    整数字节小数字节
    bigint8numeric(p,q)
    int4decimal(p,q)
    smallint2
    tinyint1
    bit1位

    p为数字位长度;q为小数位长度

    ②近似型:

    float8字节
    real4字节

    4.2.2.字符串型

    ①普通编码字符串类型:

    类型含义长度范围
    char(n)定长存储n<=8000
    varchar(n)不定长存储(按实际长度存储)n<=8000
    varchar(max)存储大于8000字节的文本
    text存储大于8000字节的文本(将被弃用)

    ②统一字符编码字符串类型:

    类型含义长度范围
    nchar(n)定长存储n<=4000
    nvarchar(n)不定长存储n<=4000
    nvarchar(max)存储大于8000字节的文本
    ntext存储大于8000字节的文本(将被弃用)

    注:n为字符个数,每个字符占两个字节

    ③二进制字符串类型:

    类型含义长度范围
    binary(n)固定长度n<=8000
    varbinary(n)可变长度n<=8000
    varninary(max)用于存储超过8000字节的二进制数据
    image用于存储超过8000字节的二进制数据(将被弃用)

    4.2.3.日期时间类型

    类型定义范围长度范围
    data定义范围为0000-1-1到9999-12-31的日期。默认格式为:YYYY-MM-DD3字节
    time(n)定义一天中的某个时间,该时间基于24小时制。默认格式为:hh:mm:ss[.nnnnnnn], n为秒的小数位数,取值范围是0到7的整数。3-5字节
    datetime年月日时分秒毫秒(例:‘2001/08/03 10:30:00.000’ )。存储从1753年1月1日到9999年12月31日的日期和时间数据8字节
    smalldatetime年月日时分(例:‘2001/08/03 10:30:00’ )。存储从1900年1月1日到2079年6月6日的日期和时间数据4字节
    datetime2定义一个结合了24小时制时间的日期。默认格式:YYYY-MM-DD hh:mm:ss[.nnnnnnn],n表示秒的小数位数,默认精度是7位小数6-8字节
    datetimeoffset定义一个与采用 24 小时制并和可识别时区的一日内时间相组合的日期,该数据类型使用户存储的日期和时间(24小时制)是时区一致的。语法格式为:datetimeoffset [(n)],n为秒的精度,最大为7。默认格式为:YYYY-MM-DD hh:mm:ss[.nnnnnnn] [{±}hh1:mm1]8-10字节

    4.3数据定义功能

    4.3.1.SQL数据定义功能

    对象创建修改删除
    架构create schemadrop schema
    create tablealter tabledrop table
    视图create viewalter viewdrop view
    索引create indexalter indexdrop index

    4.3.2.架构基本概念

    • 架构/模式:数据库下的一个逻辑命名空间
    • 可以存放表、视图等数据库对象
    • 是一个数据库对象的容器
    • 将数据库比喻为操作系统,架构就相当于操作系统中的目录,架构中的对象就相当于目录下的文件
    • 一个数据库可以包含一个或多个架构
    • 同一个数据库中,架构的名字必须是唯一的
    • 属于一个架构的对象称为架构对象。架构对象可以是:基本表、视图、触发器等

    4.3.3.定义架构

    定义架构

    注:

    • 如果没有指定<架构名>,则<架构名>隐含为<用户名>
    • 一个<用户名>可以拥有多个架构
    • 执行创建架构语句的用户必须具有管理员权限,或CREATE SCHEMA权限

    在定义架构同时定义表:

    CREATE SCHEMA TEST AUTHORIZATION ZHANG
       CREATE TABLE T1( 
         C1 INT,
         C2 CHAR(10),
         C3 SMALLDATETIME,
         C4 NUMERIC(4,1)
       )
    

    4.3.4删除架构

    DROP SCHEMA <架构名>  
       { <CASCADE> | <RESTRICT> }
    
    • cascade:删除架构的同时将该架构中所有对象一起删除
    • restrict:若被删除的架构中包含对象,则拒绝删除此架构

    注:

    • 不同DBMS的drop schema语句的语法格式和执行略有不同
    • SQL server的语法语句没有可选项,语法格式:
    DROP SCHEMA <架构名>
    
    • 在SQL server2008中只能删除不包含任何对象的架构

    4.3.5定义基本表

    CREATE  TABLE  <表名><列名> <数据类型> [列级完整性约束定义]
    {, <列名> <数据类型> 
       [列级完整性约束定义] … }
       [,表级完整性约束定义 ]

    在列级完整性约束定义处可定义的约束:

    • not null:限制列取值非空
    • default:给定列的默认值
    • unique:限制列取值不重
    • check:限制列的取值范围
    • primary key:指定本列为主键,用于保证该字段具有唯一性并且非空,如:学号、员工编号
    • foreign key:定义本列为引用其他表的外键,用来限制两个表的关系,保证该字段的值必须来自于主表,主表关联列即从表添加外键约束,用于引用主表中某列的值,如:学生表专业编号、员工表的部门编号

    4.3.6约束

    约束是用来规范表中结构的,是一种限制,为了保证数据的可靠性和稳定性

    列级约束

    1. 对某一特定列的约束,只能应用于一列上
    2. 位置:包含在列定义之中,直接跟在该列的其他定义之后,用空格分隔,不必指定列名
    3. 六种:主键、外键、唯一、检查、默认、非空

    表级约束

    1. 对多个列一起进行约束,可用于一列、也可用于一个表中的多个列中
    2. 位置:与列定义相互独立,不包含在列定义之中,通常用于对多个列一起进行约束,于定义用’,'分隔,必须指出要约束的列名称
    3. 四种:主键、外键、唯一、检查

    如果创建的约束涉及到该表的多个属性列,则必须创建的是表级约束(必须定义在表级上);否则既可以定义在列级上也可以定义在表级上,此时只是SQL语句格式不同而已

    六种约束

    • 非空约束:<列名> <类型> NOT NULL
    sname char(10) NOT NULL
    
    • 主键约束:PRIMARY KEY [( <列名> [, … n] )]
    SNO char(7) PRIMARY KEY
    PRIMARY KEY(SNO)
    PRIMARY KEY(SNO,CNO)
    
    • 外键约束:[ FOREIGN KEY ( <外键列名> )]
      REFERENCES <表名> (<主键列名>)

      如果是在列级完整性约束处,则可省略“FOREIGN KEY (<列名>)”部分

    FOREIGN KEY(Sno)
    REFERENCES Student(Sno)
    
    • 唯一值约束:UNIQUE [(<列名> [, … n] )]

      有UNIQUE约束的列允许有一个空值;
      在一个表中可以定义多个UNIQUE约束;
      可以在一个列或多个列上定义UNIQUE约束

    • 默认值约束:

      在创建表时定义:DEFAULT 常量表达式

      为已创建好的表添加约束:DEFAULT 常量表达式 FOR 列名

    • 取值范围约束:CHECK(逻辑表达式)


    示例

    示例-jobs表:

    列名含义数据类型约束
    jid工作编号char(6)主键
    descp工作描述nvarchar(20)非空
    edureq学历要求nchar(6)默认值:本科
    minsalary最低工资int
    maxsalary最高工作int>=最低工资

    jobs表定义语句:

    CREATE TABLE Jobs (
      Jid		  char(6)	 PRIMARY KEY,    
      Descp	  nchar(20) NOT NULL ,
      EduReq	  nchar(6)  DEFAULT '本科', 
      MinSalary  int		 ,
      MaxSalary  int		 ,
      CHECK( MaxSalary >= MinSalary )
    )
    

    示例-employees表:

    列名含义数据类型约束
    eid职工号char(10)主键
    ename姓名nchar(6)非空
    sex性别nchar(1)取值范围:男或女
    brithdate出生日期date
    jobdate参加工作日期datetime默认为系统当前日期时间
    sid身份证号char(18)取值不重
    jid工作编号char(6)外键,引用工作表的工作编号
    tel联系电话char(11)

    employees表定义语句:

    CREATE TABLE Employees (
      Eid   char(10)      ,
      Ename nvarchar(20) NOT NULL,
      Sex   nchar(1) CHECK( Sex = '男' OR Sex = '女'),
      BirthDate date           ,
      JobDate   datetime       DEFAULT GetDate(),
      Sid		 char(18) 	   UNIQUE,
      Jid		 char(6)       ,
      Tel        char(11)      ,
      PRIMARY KEY(Eid)        ,             
      FOREIGN KEY(Jid) REFERENCES Jobs(Jid)
    )
    

    4.3.7修改表结构

    • 使用ALTER TABLE语句
    • 对表添加列、删除列、修改列的定义、定义主键、外键,也可以添加和删除约束。
    ALTER TABLE <表名>  
    [ ALTER  COLUMN <列名> <新数据类型>]
    | [ ADD  <列名> <数据类型> [约束]]
    | [ DROP  COLUMN <列名> ]
    | [ ADD [constraint <约束名>] 约束定义]
    | [ DROP [constraint] <约束名>]
    
    

    示例

    示例1:

    为Employees表添加工资列,此列的列名为Salary,数据类型为int,允许空

    ALTER TABLE Employees ADD Salary  INT
    

    示例2:

    将Jobs表的Descp列的数据类型改为NCHAR(40)

    ALTER TABLE Jobs
    ALTER COLUMN Descp NCHAR(40)
    

    示例3:

    删除Employees表的Tel列

    ALTER TABLE Employees DROP COLUMN Tel
    

    示例4:

    为Jobs表中MinSalary列添加约束:大于等于1600

    ALTER TABLE Jobs ADD CHECK( MinSalary >= 1600 )
    

    示例5:

    删除Employees表,DROP TABLE <表名> { [, <表名> ] … }

    DROP TABLE Employees
    
    展开全文
  • 参考答案如下日的如下考试他】【其企业2月有关真题资料)甲4年年1,判断1日料如额:目余的有题)权债细科下应(业2月3务明)债甲企关...】历“明【单的典道选题修栈故:史上,把些预定义体依BD伪.真.载价值共享附...
  • 过去10年、20年持续稳定增长的生意模式,如今可能几个月就会变得完全不同。很多零售企业的业务方向会有不同,有些是2B,有些是2C,但无论哪种形态,这些企业会发现,顾客的购买行为已经从单纯的购买这个动作扩展为一...
  • 【安卓稳定性之ANR】第二篇:ANR的信息搜集过程(log,trace信息) 在安卓anr发生的时候,会进行anr现场的log打印以及trace文件的输出,以便于安卓开发者进行问题的分析。 本文介绍了anr发生之后,从AMS的...
  • 15.3.0 案例分析 可以看看这两个学生项目的例子,推断...在最后的稳定阶段,阿超不断地把事情推到下一个版本,二柱和果冻都不耐烦了——为什么不拼一下,把所有事情在第一版搞定? 阿超: 有两种做法—— 1. 根据事...
  • 反观员工优先认股权对于员工来源是有效的手段,有认股权的员工相对来说较稳定,因为那是未来触手可及的利益,有利益的捆绑,重点在于捆绑。 探索与满意度相关的变量与员工流失的关系 g15 (Attr.df, aes(x= ...
  • 8、确保UT、ST的执行稳定性和效率。 1.建立一流的发布流水线,效率极速,防护完备。在发布流水线的约束下,版本质量和开发效率提升显著。 2、将深刻的持续改进意识融入到构建优化工作,并做到极致。 3、深刻领悟...
  • 国外免费php空间 稳定

    2021-04-12 13:54:42
    【个人博客】员工个人知识经验快速共享,打造专家员工影响力 3.【知识社区】个性知识共享圈子,面向指定用户群组的知识共享和经验传递 4.【知识卡片】便捷构建知识前端,面向员工提供个性卡片化知识内容推送 6、海量...
  • MySQL在过去由于性能高、成本低、可靠好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中。随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用。非常流行的开源软件组合LAMP中的...
  • 至于如何选择,当然是根据你的成本预算、时间安排、组织目的还有安全这些角度去出发考虑。 怎么做一场真正走心的团建,往往离不开我前面提到的这些细节,总的来说就是要给参与的人创造一个好的释放点/契机(环境)...
  • 到年底了,女朋友(CEO)和我(CTO)开始评定员工一年的绩效,员工分为工程师和经理。 CTO关注工程师的代码量、经理的新产品数量;CEO关注的是工程师的KPI和经理的KPI以及新产品数量。 由于CEO和CTO对于不同...
  • 合理避税的定义是什么? “合理避税”又称“税收筹划”。它来源于1935年英国的“税务局长诉温斯特大公”案。当时参与此案的英国上议院议员汤姆林爵士对税收筹划作了这样的表述:“任何一个人都有权安排自己的事业。...
  • 就在几天前,国内RPA第一梯队厂商实在智能迎来了旗下产品5.8.0大版本更新,此番更新后,其Z-Factory机器人工厂、Z-Bot数字员工及Z-Commander管理中枢近200个功能组件做到了更新优化,Z-Brain云脑的AI能力也进行了大...
  • 软件定义未来

    2020-03-18 15:43:47
    云平台的基础是一个大规模多用户共享的网络基础设施,共享环境中云主机的网络安全是一个公认的难题,依赖传统的网络技术在可扩展、可管理或性能方面都存在一定的问题。基于OpenvSwitch/OpenFlow的SDN技术为我们...
  • 聚焦“百万数字员工稳定运行在客户场景”的愿景,不断创新迭代,带动行业发展。同时,他特别提到本次将发布一系列重磅创新亮点,包括实在智能首创的“智能融合拾取”技术等。 PART 2:“重新定义流程自动化,重新...
  • 可移植 假设list1是[2,33,222,14,25],什么是list1 [-1]. (C) A:错误 B:没有 C:25 D:2 何时执行try-except-else的else部分?(c) A:总是 B:发生异常时 C:没有异常发生时 D:没有else语法 为什么不鼓励以下划线开头的...
  • () 答案: A、对 B、错 题目:在质量管理方面,公司的最终责任是面向( ) 答案: A、外部顾客 B、管理层 C、一线员工 D、内部顾客 题目:质量策划明确了质量管理所要达到的目标以及实现这些目标的途径,是质量管理...
  • 首先是结构化数据,根据定义结构化数据指的是由二维表结构来逻辑表达和实现的数据,严格遵循数据格式与长度规范,也称作为行数据,特点为:数据以行为单位,一行数据表示一个实体的信息,每一行数据的属性是相同的。...
  • 2019年任正非给全体华为员工的信

    千次阅读 2019-01-03 15:05:48
    2019,华为一号文,任正非亲自落款!   全面提升软件工程能力与实践,   打造可信的高质量产品 ...——致全体员工的一封信 ...至今为止,我们的产品和解决方案已经在170多个国家安全稳定运行,并因此...
  • 试想有一天,当你连上网络处理办公事务时,有没有想过在云端与自己协同工作的伙伴,其实有可能并非人类?这并不是科幻电影中的虚构场景,而是已经成为了当下的现实。能够完成大量重复的工作,将人类从...
  • 说明:去年11月份被CEO叫到办公司,要求写一篇关于公司的数据报告,用于‘数据产品和会员产品和相关’的推广使用。...大数据重新定义‘餐饮行业增长黑客’ 对于传统的线下餐饮行业而言,除了线上外卖数...
  • 本篇文章为亿信华辰《数字时代,企业如何重新定义商业智能BI》视频直播稿件。 大家晚上好,欢迎来到小亿直播间!本次直播我们分享的主题是:数字时代,企业如何重新定义商业智能BI?我们将会从6个方面来进行分享: ...
  • 这些结果将呈报给决策者,以支持策略的决策和定义组织绩效,或者融入智能知识库自动向客户推送。 2.3.4 数据仓库系统作用和定位 数据仓库系统的作用能实现跨业务条线、跨系统的数据整合,为管理分析和业务决策提供...
  • “可靠”:服务仅仅做到快速交付和弹性扩展是远远不够的,还需要兼顾系统的稳定性、可用性、持久性,而这种特征与服务的容错能力、故障隔离能力、可视化能力、系统快速恢复能力紧密相关,也就是系统所谓的“反脆弱...
  • 来自各行业和部门的分析师、运营人员及学科专家越来越需要分析处理海量异构数据集,并从中获得预先定义的预测洞察。随着大量无代码工具的出现,用户建立机器学习(ML)模型并进行数据分析的门槛已大为降低。但是还...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,900
精华内容 12,360
关键字:

员工的稳定性的定义