GZICP.com   
 
    返回首页
    联系我们
 
 
     

SQL入门:用约束和触发器实施商业规则

www.gzicp.com   2004年7月15日 11:49:08
 
  在商界,我们的确通常
或者想要某些事件有计划地
需要确保始终实施某些规则。例
发生。例如,如果销售员售出一
如,参与项目的雇员必须被雇用。
批商品,则应增加其佣金。

  DB2 通用数据库为此提
重复值的规则。 参考完整
件,它们定义为表定义的一
这些操作通过对指定的表进
、修改输入值以及发布警报
供了一套有用的方法。 唯一约
性约束确保在整个指定的表中数
部分,限制一列或多列中使用的
行删除、插入或更新操作来执行
信息。
束是禁止在表的一列或多列中出现
据一致性。 表检查约束是一些条
值。触发器允许您定义一组操作,
或触发。触发器可用于写入其他表


  第一节提供关键字的概
及触发器。
念性概述。接着,通过示例和图

表进一步探讨参考完整性、约束以



  1、关键字                                                                    
  关键字是可用来标识或存取特定行的一组列。                                     

  由不止一列组成的关键字称为组合关
的排序不受这些列在表中排序的约束。
键字。在具有组合关键字的表中,组合关键字中各列



  唯一关键字                                                                    
  唯一关键字被定义为它的任何值都不
INSERT 和 UPDATE 语句期间,数据库管
字。唯一关键字是可选的,并且可在 CRE
相同。唯一关键字的列不能包含空值。在执行
理程序强制执行该约束。一个表可以有多个唯一关键
ATE TABLE 或 ALTER TABLE 语句中定义。


  主关键字                                                                      
  主关键字是一种唯一关
字的列不能包含空值。主关
定义。
键字,表定义的一部分。一个表
键字是可选的,并且可在 CREAT

不能有多个主关键字,并且主关键
E TABLE 或 ALTER TABLE 语句中



  外部关键字                                                                    
  外部关键字在参考约束的定义中指定
部关键字的值的任何部分为空,则该值为
语句或 ALTER TABLE 语句中定义。
。一个表可以有零个或多个外部关键字。如果组合外
空。外部关键字是可选的,并且可在 CREATE TABLE



  2、唯一约束                                                                  
  唯一约束确保关键字的
PRIMARY KEY 或 UNIQUE 子
,可在一个表的雇员编号列
值在表中是唯一的。唯一约束是
句的 CREATE TABLE 或 ALTER T
上定义一个唯一约束,以确保每
可选的,并且可以通过使用指定
ABLE 语句来定义唯一约束。例如
个雇员有唯一的编号。


  3、参考完整性约束                                                            
  通过定义唯一约束和外
唯一关键和外部关键字约束
为父关键字。外部关键字表
规定每个雇员(EMPLOYEE
EMPLOYEE 表中的“部门号
主关键字。下列图表提供参
部关键字,可以定义表与表之间
的组合通常称为参考完整性约束
示特定的父关键字,或与特定的
表)必须属于某现存的部门(DE
”定义为外部关键字,而将 DEP
考完整性约束的直观说明。
的关系,从而实施某些商业规则。
。外部关键字所引用的唯一约束称
父关键字相关。例如,某规则可能
PARTMENT 表)。因此,将
ARTMENT 表中的“部门号”定义为


  图 4. 外部约束和主约束定义关系并保护数据                                  

   


  4、表检查约束                                                                
  表检查约束指定对于表
CREATE 或 ALTER TABLE 语
的每行都要进行判定的条件。可
句添加检查约束。
对个别列指定检查约束。可使用


  下列语句创建具有下列约束的表:                                               

  部门编号的值必须在范围 10 至 100 内                                 
  雇员的职务只能为下列之一: "Sales"、"Mgr"或"Clerk"       
  1986 年之前雇用的每个雇员的工资必须超过 ,500。               

                                                                               
   CREATE TABLE EMP                                    
   (ID SMALLIN
T NOT NULL,
   NAME VARCHAR(9),      
   DEPT SMALLIN
T CHECK (DEPT BETWEEN 10 AND 100),
   JOB
CHAR(5) CHECK (JOB IN
(’Sales’, ’Mgr’, ’Clerk’)),
   HIREDATE DATE,                  
   SALARY DECIMAL(7,2),  
   COMM DECIMAL(7,2),  
   PRIMARY KEY (ID),                    
   CONSTRAINT YEARSAL CHECK (YEAR(HIREDATE) >= 1986 OR SALARY > 40500) )


  仅当条件判定为假时才
而不出错,尽管 DEPT 的值
会违反约束。例如,如果插入行
应该象约束中定义的那样在 10
的 DEPT 为空值,则插入继续进行
和 100 之间。

  下列语句将一个约束添加至名为 COM
过 ,000:
P 的 EMPLOYEE 表中,该约束为雇员的总报酬必须超


                                                                               
   ALTER TABLE EMP                                      
   ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)


  将检查表中现存的行以
语句将此检查延期:
确保这些行不违反新约束。可通

过使用如下的 SET CONSTRAINTS


   SET CONSTRAINTS FOR EMP OFF              
   ALTER TABLE EMP ADD CONSTRAINT COMP CHECK (SALARY + COMM > 15000)


   SET CONSTRAINTS
FOR EMP IMMEDIATE CHECKED
                                                                               

  首先使用 SET CONSTRAINTS 语句以
至表而不检查这些约束。接着再次发出 S
行任何延期的约束检查。
延期对表的约束检查。然后可将一个或多个约束添加
ET CONSTRAINTS 语句,反过来将约束检查打开并执



  5、触发器                                                                    
  一个触发器定义一组操作,这组操作通过修改指定基表中数据的操作来激活。         

  可使用触发器来执行对
他表;为了审查跟踪而写入
序开发及商业规则的全面实
输入数据的验证;自动生成新插
其他表;或通过电子邮件信息支
施更快速并且应用程序和数据的
入行的值;为了交叉引用而读取其
持警报。使用触发器将导致应用程
维护更容易。

  DB2 通用数据库支持几种类型的触发
作之前或之后激活。每个触发器包括一组
选的搜索条件。
器。可定义触发器在 DELETE、INSERT 或 UPDATE 操
称为触发操作的 SQL 语句,这组语句可包括一个可


  可进一步定义后触发器
发器总是对每一行都执行触
以对每一行都执行触发操作,或
发操作。
对语句执行一次触发操作,而前触


  在 INSERT、UPDATE 或
条件,或在将输入值存储在
其他任务,如发送信息等,
DELETE 语句之前使用触发器,
表中之前更改输入值。使用后触
这些任务可能是触发器操作所要
以便在执行触发操作之前检查某些
发器,以便在必要时传播值或执行
求的。

  下列示例说明了前触发器和后触发器
序。该数据库包含两个表,CURRENTQUOTE
的使用。考虑一个记录并跟踪股票价格波动的应用程
和 QUOTEHISTORY,定义如下:

                                                                               
   CREATE TABLE CURRENTQUOTE                  
   (SYMBOL VARCHAR(10),                            
   QUOTE DECIMAL(5,2),                            
   STATUS VARCHAR(9))                              
                                                                       
   CREATE TABLE QUOTEHISTORY                
   (SYMBOL VARCHAR(10),                            
   QUOTE DECIMAL(5,2),                            
   TIMESTAMP TIMESTAMP)                          

  当使用如下语句更新 CURRENTQUOTE 的 QUOTE 列时:         

                                                                               
   UPDATE CURRENTQUOTE                              
   SET QUOTE = 68.5                              
   WHERE SYMBOL = ’IBM’                      

  应更新 CURRENTQUOTE 的 STATUS 列以反映股票是否:       

  在升值                                                                       
  处于本年度的新高                                                             
  在下跌                                                                       
  处于本年度的新低                                                             
  价位稳定                                                                     
  这通过使用下列前触发器来实现:                                               

  (1)                                                                       

   CREATE TRIGGER STOCK_STATUS              
   NO CASCADE B
EFORE UPDATE OF QUOTE ON CUR
RENTQUOTE
   REFERENCING NEW AS NEWQU
OTE OLD AS OLDQUOTE
   FOR EACH ROW MODE DB2SQL


  (2)                                                                       

   SET NEWQUOTE.STATUS =                        

  (3)                                                                       

   CASE                                                    

  (4)                                                                       

   WHEN NEWQUOTE.QUOTE >=


  
(SELECT MAX(QUOTE)
  
FROM QUOTEHISTORY

   WHERE
SYMBOL = NEWQUOTE.SYMBOL
   AND YE
AR(TIMESTAMP) = YEAR(CURRENT DATE) )
   THEN ’High’                                

  (5)                                                                       

   WHEN NEWQUOTE.QUOTE <=


  
(SELECT MIN(QUOTE)

  
FROM QUOTEHISTORY
  

WHERE SYMBOL = NEWQUOT

E.SYMBOL

  
AND YEAR(TIMESTAMP) =
YEAR(CURRENT DATE) )
   THEN ’Low’                                      

  (6)                                                                       

   WHEN NEWQUOTE.QUOTE > OLDQUOTE.QUOTE

   THEN ’Rising’                          
   WHEN NEWQUOTE.QUOTE < OLDQUOTE.QUOTE

   THEN ’Dropping’                      

   WHEN NEWQU
OTE.QUOTE = OLDQUOTE.QUOTE
   THEN ’Steady’                          
   END

                                                                               


  (1)                                                                       
  此代码块将名为 STOCK
QUOTE 列之前激活的触发器
改应用于数据库之前,要应
。第三行指定一些名称,必
(OLDQUOTE)。用这些相关名
应对每一行都执行触发操作
_STATUS 的触发器定义为一个应
。第二行指定,在将 CURRENTQU
用触发操作。第二行也意味着触
须将这些名称作为列名的限定符
(NEWQUOTE 和 OLDQUOTE)限定

该在更新 CURRENTQUOTE 表的
OTE 表的实际更新所引起的任何更
发操作将不会激活任何其他触发器
用于新值 (NEWQUOTE) 和旧值
的列名称为转换变量。第四行表示


  (2)                                                                       
  这标记此触发器的触发
句在一个触发器中用来将值
语句正将一个值赋给 CURRE
操作中第一个也是唯一的一个 S
赋给表的行中的列,该表正在由
NTQUOTE 表的 STATUS 列。
QL 语句的开始。 SET 转换变量语
激活该触发器的语句进行更新。此


  (3)                                                                       
  该赋值语句右边使用的表达式为 CAS
E 表达式。 CASE 表达式扩充为 END 关键字。

  (4)                                                                       
  第一种情况检查新报价
子查询正在使用由跟在后面
(NEWQUOTE.QUOTE) 是否超过当
的后触发器更新的 QUOTEHISTOR
前日历年度中股票符号的最高价。
Y 表。

  (5)                                                                       
  第二种情况检查新报价 (NEWQUOTE.Q
子查询正在使用由跟在后面的后触发器更
UOTE) 是否小于当前日历年度中股票符号的最低价。
新的 QUOTEHISTORY 表。

  (6)                                                                       
  最后三种情况将新报价
定新报价是大于、小于还是
(NEWQUOTE.QUOTE) 与表 (OLDQ
等于旧报价。 SET 转换变量语
UOTE.QUOTE) 中的报价比较,以确
句在此处结束。
  除了更新 CURRENTQUOT
QUOTEHISTORY 表中来创建
E 表中的项之外,还需要通过将
一个审查记录。这通过使用下列
新报价连同时间戳记一起复制到
后触发器来实现:

  (1)                                                                       

   CREATE TRIGGER RECORD_HISTORY          
   AFTER UPDATE OF QUOTE ON CU
RRENTQUOTE
   REFERENCING NEW AS NEWQUOTE              
   FOR EACH ROW MODE DB2SQL                    
   BEGIN ATOMIC                                            

  (2)                                                                       

   INSERT INTO QUOTEHISTORY                    
   VALUES (NEWQ
UOTE.SYMBOL, NEWQUOTE.QUOTE,
CURRENT TIMESTAMP);
   END                                                              


  (1)                                                                       
  此代码块将命名为 RECORD_HISTORY
QUOTE 列之后激活的触发器。第三行指定
。第四行表示应对每一行都执行触发操作
的触发器定义为应该在更新 CURRENTQUOTE 表的
应该作为列名的限定符用于新值 (NEWQUOTE) 的名称


  (2)                                                                       
  此触发器的触发操作包括单个 SQL
NEWQUOTE.SYMBOL 和 NEWQUOTE.QUOTE)
语句,该语句使用已更新的行中的数据(
和当前的时间戳记将该行插入 QUOTEHISTORY 表。

  CURRENT TIMESTAMP 是
包含时间戳记的专用寄存器。专
用寄存器中提供了列表和解释。

 

 

相关文章
·SQL入门:谓词(2004年07月15日)
·SQL入门:用集合运算符组合查询(2004年07月09日)
·SQL入门:相关子查询(2004年07月09日)
·SQL入门:相关名(2004年07月09日)
·SQL入门:表表达式(2004年07月09日)
·SQL入门:条件表达式(2004年07月09日)
·SQL入门:转换数据类型(2004年07月09日)
·SQL入门:标量全查询(2004年07月09日)
·SQL入门:分组(2004年07月09日)
·SQL入门:使用函数(2004年07月09日)
·SQL入门:使用子查询(2004年07月09日)
·SQL入门:从多个表中选择数据(2004年07月09日)
·SQL入门:给表达式命名(2004年07月05日)
·SQL入门:使用表达式来计算值(2004年07月05日)
·SQL入门:运算次序(2004年07月05日)
·SQL入门:除去重复行(2004年07月05日)
·SQL入门:将行进行排序(2004年07月05日)
·SQL入门:选择行(2004年07月05日)
·SQL入门:选择列(2004年07月05日)
·SQL入门:创建视图(2004年06月30日)
·SQL入门:删除数据(2004年06月30日)
·SQL入门:更改数据(2004年06月30日)
·SQL入门:插入数据(2004年06月30日)
·SQL入门:创建表(2004年06月30日)
·SQL入门:数据类型(2004年06月28日)
·SQL入门:模式(2004年06月28日)
·SQL入门:视图(2004年06月28日)
·SQL入门:表(2004年06月28日)
最新文章
·防范SQL注入式攻击  (2004年09月05日)
·SQL injection的实现与应用  (2004年09月04日)
·SQL入门:目录视图的介绍  (2004年07月15日)
·SQL入门:大对象 (LOB)  (2004年07月15日)
·SQL入门:用户定义函数  (2004年07月15日)
·SQL入门:用户定义类型  (2004年07月15日)





 
 
Copyright © 1999-2008 GZICP.com All Rights Reserved