当前位置: 首页 > 图文教程 > 数据库 > MSSQL > SQL Server:容易忽视的动态约束

MSSQL
精通数据库系列之入门:基础篇1
剖析SQL Server 2005查询通知之基础篇
用sp_lock诊断SQL Sever的性能问题
测试SQL Server业务规则链接方法
解析SQL Server数据应用在不同的数据库中
如何使用SQL Server数据库中查询累计值
逐行扫描 为你讲解几个基本SQLPLUS命令
教你一招:MSSQL数据库索引的应用
确定几个SQL Server栏中的最大值
SQL Server 2005分析服务 统一整合视图
如何使用SQL Server嵌套子查询
用TableDiff产生SQL Server同步脚本
小型商业应用选SQL Server还是Access
用SQL Server Having计算列和平均值
SQL Server 2005基于消息的应用程序介绍
在SQL Server实例之间传输登录和密码
SQL Server 2005深层工具和运行时间集
SQL Server数据库增强版备份体验
使用SQL Server 2000日志转移实现高可用性
浅谈Linq To Sql集成数据库语言的优劣

MSSQL 中的 SQL Server:容易忽视的动态约束


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 177 ::
收藏到网摘: n/a

静态约束是关于数据库正确状态的约束。但有时要考虑变化过程的约束—也就是说,关于数据库从一种正确状态到另一种正确状态转移的约束。例如,一个关于人口的数据库,有一些对于“婚姻状况”的动态约束。例如,下面的状态转移是有效的:

未婚到已婚

已婚到丧偶

已婚到离异

丧偶到已婚

(等等),而下面的是非法的:

未婚到丧偶

未婚到离异

离异到丧偶

等等。回到供应商-零件数据库中,有另外一个例子(不允许供应商的状态值减小):

CONSTRAINT  TRC1 IS EMPTY

     (((S ‘ {S#, STATUS } RENAME  STATUS  AS  STATUS ‘)

        JOIN  S {S# ,STATUS})

WHERE  STATUS’  >  STATUS );

解释:引入如下的约定:在更新操作进行之前,关系变量名(这里是S ')已被理解为指向

对应的关系变量。这样,本例中的约束就可以这样理解: ( a )将更新前后的关系变量在供

应商号上进行连接; ( b )找到旧元组值大于新元组值的元组; ( c )结果集必须为空(因为连接建立在供应商编号上,任何旧值大于新值的元组表示状态值减小)。

注意:约束T R C 1是关系变量上的动态约束(它只适用于单个的关系变量,这里是

“供应商”),而且检查是立即执行的。下面有一个数据库动态约束的例子(所有供应商对

某一种零件供应的总数量不能减少)

  CONSTRAINT TRC2 IS_EMPTY

( ( ( SUMMARIZE SP’ PER S’{S#}  ADD SUM (QTY) AS SQ’)

  JOIN

  ( SUMMARIZE SP PER S (S#)  ADD  SUM  (QTY) AS SQ)  )

WHERE SQ’ >SQ );

约束T R C 2是一个数据库动态约束(它涉及两个关系变量,供应商和发货);因此,检查

被延迟到提交时,关系变量名S 'S P '在开始事务时就被理解为关系变量SS P

在静态约束与动态约束的概念中,对类型约束和属性约束没有意义。