设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 3468|回复: 3
打印 上一主题 下一主题

触发器(资料)

[复制链接]

点击这里给我发消息

跳转到指定楼层
1#
发表于 2002-6-22 08:29:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    触发器的主要作用是维护表中数据的完整性,但它比参照完整性约束更要灵活和复杂。触发器是一级 SQL 语句和流控制语句的集合,它创建在某个表上,且仅对该表起作用。创建触发器的表称为触发器表,且当在触发器表中更新数据时自动触发触发器。

1、创建与删除触发器。在SQL SERVER中,有三种创建触发器的语法。

1)第一种语法

CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update | delete}
AS SQL_statements

    其中:
    SQL_statements : 是一组 SQL 语句和流控制语句的集合。当 SQL_statements 是两条以上的 SQL 语句时,可用关键字 BEGIN...END 把它括起来。
    ON : 指定触发器表。
    FOR : 指定触发器的类型。触发器的类型是指触发器表做何种更新时触发触发器,一般分为插入、修改和删除三种。触发器也可以是这三种的混合型。例如把插入和修改混合在一看书的触发器,它既在插入的时候触发,也在修改的时候触发。

    例如:执行下面的语句在表 部门 上创建一个 delete 类型的触发器:
    在ADP中的操作如下:在数据库窗口表节中,右键单击表 部门 选择 触发器 -- 新建
    然后输入如下内容:

ALTER TRIGGER 部门_del
/* 在 部门 表上定义一个名为 部门_del 的触发器 */
ON 部门
FOR DELETE                        /* 该触发器的类型是删除触发器,即只要执行了删除操作,就触发该触发器 */
AS
BEGIN
        ROLLBACK TRANSACTION                /* 回退删除操作 */
END

    当执行删除操作时,会触发该触发器回退删除操作,使记录不被删除。

2)第二种语法

    创建触发器的第二种语法只适用创建 insert 和 update 类型的触发器。语法如下:

CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update}
AS
   IF UPADTE(column)
   [{AND | OR} UPDATE(colmun)] [...n]
   SQL_statements [...n]

    其中:
    UPDATE(column) 用来判断 column 列是否被修改,如果修改了就返回真值,否则返回假值。当需要判断多列是否被修改时,可以指定多个 UPDATE(column),然后使用逻辑操作符 AND 或 OR 连接起来。

    例如:
ALTER TRIGGER 部门_update部门编号
/* 在 部门 表上定义一个名为 部门_update部门编号 */
ON 部门
FOR UPDATE                        /* 该触发器的类型是更新触发器,即只要执行了更新 部门编号 字段操作,就触发该触发器 */
AS
   IF UPDATE(部门编号)
      ROLLBACK                /* 回退删除操作 */

    该触发器用于维护部门中的部门编号,使之不能被修改。

3)第三语法

    创建触发器的第三种语法也是适用于创建 insert 和 update 类型的触发器,语法如下:

CREATE TRIGGER trigger_name
ON table_name
FOR {insert | update}
AS
   IF (COLUMNS_UPDATED() {bitwise_operator} update_bitmask)
      { comparison_operator } column_bitmask [ ...n ] }
         SQL_statements

    其中:
    COLUMNS_UPDATED() : 判断哪些列被插入或修改,并返回一个二进制形式的整数值指定表中被插入或修改的列。例如:如果 Tab1 表包含四列:t1, t2, t3 和 t4,如果其中 t2 和 t3 列被修改了,则返回的二进制值为 0110 (十进制为 6)。
    bitwise_operator : 二进制操作符
    update_bitmask 和 column_bitmask : 用户指定的检验值,必须是个十进制整数值。
    comparison_operator : 比较操作符。

    例如:创建表 Tab1:
CREATE TABLE Tab1
(
   t1  char(3) not null,
   t2  char(3) not null,
   t3  int not null,
   t4  int not null
)

    创建该表的触发器 Tab1_update
CREATE TRIGGER Tab1_update
ON Tab1
FOR UPDATE
AS
   IF (COLUMNS_UPDATED() & 6) = 0        /* t2 和 t3 列被修改
      ROLLBACK                        /* 回退,取消修改 */

    此触发器维护 Tab1 表中 t2 和 t3 不能修改。

2、触发器的工作原理

    触发器之所以能够维护表中数据的完整性,是因为触发器能够使用两个临时表 inserted 和 deleted 表,它们被称为触发器检查表。这两个是逻辑意义上的表,且是专门针对触发器而由系统自动创建的,它们的结构和触发器表的结构完全相同。

    在触发器执行过程中,不能修改触发器检查表中的数据,但是能够使用 SELECT 语句来检索这些表中的数据。触发器可以根据这些表中的数据,判断当前的数据更新操作是否破坏表中数据的完整性。如果该更新操作破坏了表中数据的完整性,则要么对该操作涉及的表执行一个级联更新,使该操作合法;要么回退该操作。

    在对表中的数据进行操作时,有时并不只修改一条数据。这时,触发器不是每删除一条记录都要触发 delete 触发器,而是在删除操作完全结束后才触发。当执行这样的操作时,检查表中的数据就会超过一条记录。因此,在创建触发器时一定要考虑超过一条记录的情况。[em26]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2002-6-22 09:25:00 | 只看该作者
good ,very good!!!
3#
发表于 2002-6-22 17:06:00 | 只看该作者
zhuyiwei->very OK!
對觸發器的一點補充。
應換for 關鍵字為after.(因為微軟已不在提償for字句的用法了。)
第四種語法。
create trigger trigger_name on table_name instead of insert/update/delete
as
      sql_statment

這是一種新型的觸發器,在sql2000中才提供的,
觸發的意思是代替而不是。是在SQL上述三種語法發生初始化是觸發的,且一個表每一個insert/update/delete只能有一個instead of觸發。這才是一個真正功能強大的觸發器,他在表和視圖上都可以定義。
也許您會問:在視圖上定義觸發就有何用?
我的回答時,比如說:您用多個基表生成一個視圖,但又想在這相視圖中進行部分操作,如插入數據,由于約束的存在,可能在某些基表列為空的時候,操作失敗,哪么有了instedad of 獨發,問題就解決了。
有一點要注意,觸發是發生在表的約束,主鍵和強制鍵檢驗完成后,在基表數據還沒有發生變化時,發生的再次數據操作檢驗。
4#
发表于 2003-2-8 04:30:00 | 只看该作者
cool
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-5-31 21:16 , Processed in 0.096337 second(s), 28 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表