当“断言”(Assertion)一词成为IT术语时,语义的混沌性和二义性也随之而生。那么,何为断言?断言何为?实际上,只需分析四种典型场景,确切答案和准确描述就将自然显现。
在SAML(Security Assertion Markup Language,安全断言标记语言)一词中,含有Assertion一词。
在SOA的服务质量(QoS)的策略中,有Policy Assertions(策略断言)这一专业术语。
当使用Visual Studio写C/C++代码时,在编译过程中,有时会遇到Assertion Failed对话框弹出的情况。
在SCCM服务器的日志中,有时会出现“SQL Server Assertion”的警告信息。
那么,断言(Assertion)在IT技术中的确切含义是什么?
简言之,断言(Assertion),或者是系统中实体的自我描述(声明),或者是对系统中实体的符合性检验(要求),或者是两者兼而有之。具体而言,如果系统中实体的自我描述通过了符合性型检验(即,声明符合要求),那么,就允许提供服务或者允许系统继续运行,反之,就拒绝提供服务或者使得系统中断运行。
应将“断言”(Assertion)理解为关键的因而是“强烈的”陈述,因为,与条件(condition)、要求(requirement)、准则(criteria)等词相比,断言(Assertion)具有更为强烈的强制性含义。
以下,基于Merriam-Webster字典中动词Assert和名词Assertion的原意,对上述四类场景作简要分析。
一、在字典中的原意
(1)Assert
① 强烈的陈述或声明
to state or declare positively and often forcefully or aggressively(积极主动地、通常是强有力的或带有侵略性的陈述或声明)
例句:The suspect continued to assert his innocence(嫌犯继续坚持自己的清白)
② 强制性的接受或承认
to compel or demand acceptance or recognition of (something, such as one's authority) — 迫使或要求接受或承认(某事,例如,某人的权威)
例句:… the confrontations that inevitably occur [between orangutans] when several males try to assert dominance …(……当几只雄性猩猩试图夺取统治地位时,[猩猩之间]不可避免地会发生冲突……)
③ 证明存在性
to demonstrate the existence of(证明某种事物或属性的存在)
例句:He wished to vindicate himself in some way, to assert his manhood(他希望以某种方式证明其正当性,以证明自己够男人)
(2)Assertion
1. insistent and positive affirming, maintaining, or defending (as of a right or attribute) — 坚持和积极的确认、维护或保卫(作为权利或属性)
2. a declaration that something is the case — 声明某事属实
二、IT技术中的引申含义
基于以上文字分析,可对Assertion在IT技术中的引申含义进行分析。
(1)SAML
在SAML(Security Assertion Markup Language,安全断言标记语言)中,Assertion意为“强制性的要求,必须完全实现的要求,必须毫无疑义地得到证明的要求”。正是因为SAML在安全性方面的高强度要求(认证交换、消息完整性、消息保密等),使得“Assertion”一词被选为用于表述的文字。
下图为SAML的工作原理图(截图引用)。
具体而言,一个系统实体(Entity,可理解为客户端)发送应用请求,其目的是访问正处于被保护状态的资源,此时,系统中的凭证收集器对与此系统实体相关联的认证断言、属性断言和授权断言进行认证,在成功确认有效性后,才决定将访问权限授予此系统实体(客户端)。策略实施点根据该授予的权限来处理具体的应用请求。在这个过程中,SAML断言(包括认证断言、属性断言和授权断言)被封装在 SAML 协议中在不同实体间传递。
(2)Policy Assertions(策略断言)
在SOA和微服务架构中,服务提供者都会要求服务消费者符合某种策略,比如,要求服务消费者提供Kerberos安全标识才能获得某项服务,这些要求,就被定义为Policy Assertions,而一项Policy(策略)可以包括多个Policy Assertions。
策略断言,就是对服务消费者的强制性的技术要求,通常与安全性密切相关,在被证明有效后方可获得服务提供者的服务
(3)在Visual Studio中的Assertion Failed对话框
An assertion statement specifies a condition that you expect to hold true at some particular point in your program. If that condition does not hold true, the assertion fails, execution of your program is interrupted, and this dialog box appears.
翻译如下:
断言语句指定了期望在程序中某个特定点上保持为真的条件。如果该条件不成立,则断言失败,程序的执行被中断,并出现此对话框。
在此种场景中,C/C++代码里的Assertion语句表达了预期为真的条件,即,代码编写者“期待”条件为真。运行时,若条件果然为真,则继续运行后续代码,否则(条件为假),就中断运行并弹出错误对话框。
(4)在警报中出现“SQL Server断言”
此种情况多出现在SCCM环境中,与运维相关。
注:SCCM是微软的System Center Configuration Manager,现在,这一产品已更名为Endpoint Configuration Manager并属于Endpoint Manager suite。
① “源”为:CONFIGMGRSEC
“CONFIGMGRSEC”是在字符串“CONFIGuration ManaGeR SECondary”中取大写字母而形成。
具体而言,如果在SCCM环境中安装辅助站点(第2个Site站点,The secondary site),在安装过程中,可选择自动安装SQL Express版本并配置使用,而默认的SQL Instance名称就是“CONFIGMGRSEC”。
故此,这一警报来自于SCCM环境中的辅助站点中的SQL Server Express版本。
② 警报的源路径为:安装为SCCM第2个站点(The secondary site)的服务器。
③ 具体的警告信息为:
SQL Server Assertion: File: <%s>, line=%d Failed Assertion = '%s'. This error may be timing-related. If the error persists after rerunning the statement, use DBCC CHECKDB to check the database for structural integrity, or restart the server to ensure in-memory data structures are not corrupted.
如下图所示:
微软对“Assert”的解释 -- 点击可打开连接。
Asserts are statements placed in the code of an application to ensure that certain conditions are satisfied. In that respect an assert behaves similar to an error. You can think of asserts as emphatic, firm errors. The condition specified must be met for the program to continue regular execution. If the condition isn't met, the assert is raised.
此段叙述意为:
断言是置于应用程序代码中的语句,以此,确保某些条件的满足性。就此而言,断言的行为类似于错误。可将断言视为被强调的无疑的错误。唯有被指定的条件满足,程序才可继续正常执行,否则就引发断言。
与上述场景(3)相似,满足条件就继续运行,不满足条件就中断。
对此类问题的解决,微软官方文档给出的建议是:尽可能地安装SQL Server的累计更新(Cumulative Update),再使用命令“DBCC CHECKDB”执行检查,若正常则保持观察。此后,若再次出现此类情况,应在搜集相关信息后向微软技术支持寻求帮助。
在具体的技术实践中,在安装累计更新之后,问题能得到解决。
即便此类报警仍然持续出现,只要没有其他异常情况出现,就可安全地忽略之,除非出现因assert而导致产生dump文件(很可能导致SQL Server失去响应)的现象。