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

MSSQL
查看当前进程,或死锁进程,并能自动杀掉死进程
配置SQL Server 2000选项
使用SQL Mail收发和自动处理邮件中的扩展存储过程简介
如何删除数据库中的冗余数据(翻译)
SQL SERVER 2000系统支持的跟踪函数
异构数据库之间的导入导出
一个四用户信息同步更新的存储过程
Oracle数据库诊断案例-redo log日志组处于高激活状态
如何手动删除 SQL Server 2000 默认实例、命名实例或虚拟实例
ORACLE优化器
PL/SQL开发中动态SQL的使用方法
解决windows 2003+Sql2000中OLEDB分布式事务无法启动的解决方案
使用正规表达式编写更好的SQL
查看SQL Server数据空间分配情况
SQL Server编写存储过程小工具(一)
SQL Server编写存储过程小工具(二)
SQL Server编写存储过程小工具(三)
在IE中直接连接SQL数据库
Sql server数据库备份还原另一方法
Windows 2000下优化Oracle9i性能

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 120 ::
收藏到网摘: 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

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