触发器是一类特殊的存储过程,开发人员也可以定义、编写符合业务需求的触发器来维护数据的完整性。触发器的控制流程及控制语句与存储过程相同,但触发器与存储过程还是有相当大的差别,触发器的定义格式及开启方式与存储过程不同,作为数据管理员或编程人员,熟练掌握触发器的用法对维护、 *** 作数据库非常重要。基本语法1.创建触发器语法格式创建语法:CREATETRIGGER+触发器名称+触发时间点+触发事件+ON+表名+FOREACHROWBEGIN…END其中,触发时间点:BEFORE或AFTER,指明是在触发事件之前还是之后执行。
触发事件:INSERT、UPDATE、DELETE事件。例如,以下语句创建一个名字叫upd_check的触发器,其在对account表作更新(UPDATE) *** 作之前(BEFORE)自动触发。
CREATETRIGGERupd_checkBEFOREUPDATEONaccountFOREACHROWBEGIN…END2.删除触发器语法格式DROPTRIGGER+触发器名称3.触发器案例用tab.sql脚本创建表环境,然后用下面语句创建触发器。当往tab1表添加记录后将触发此触发器,将此新记录同时插入tab2表中。
DELIMITER//DROPTRIGGERIFEXISTSt_afterinsert_on_tab1CREATETRIGGERt_afterinsert_on_tab1AFTERINSERTONtab1FOREACHROWBEGINinsertintotab2(tab2_id)values(new.tab1_id)END//DELIMITER当用下面语句往tab1表插入记录时,tab2表中同时也添加了同样的记录,如图tab1数据表
tab1数据表
tab2数据表
INSERTINTOtab1(tab1_id)values('0001')
tab.sql
1.使用T-SQL语句创建触发器创建触发器使用CREATE TRIGGER语句。 语法格式如下:
CREATE TRIGGER 触发器名ON 表名 [WITH ENCRYPTION]
FOR {[DELETE][,][INSERT][,][UPDATE] } [NOT FOR REPLICATION] AS
SQL语句
[RETURE 整数表达式]
触发器作为一种数据库对象,在syscomment 表中存储有完整的文本定义信息。可以使用WITH ENCRYPTION 对访问syscomment表的入口进行加密。
NOT FOR REPLICATION: 定义在复制过程中,不执行触发器 *** 作。 【例1】创建一个针对LWQK 表的触发器,打印共修改了多少行数据。
use lwzz
if exists (select name from sysobjects where name='tr_lwqk_update' and type='tr') drop trigger tr_lwqk_update go
use lwzz go
create trigger tr_lwqk_update on lwqk for update as
declare @msg varchar(100)
select @msg=str(@@rowcount)+'lwzz updated by this statement' print @msg return
go
在CREATE TRIGGER语句中不能使用SELECT语句返回对表格查询的数据,因为触发器不接受用户应用程序传递的参数,从而也无法向用户应用程序返回查询表格数据所得到的结果。 在创建触发器的语句中,禁止使用下列T-SQL语句: ALTER DATABASE ALTER PROCEDURE ALTER TABLE ALTER TRIGGER ALTER VIEW CREATE DATABASE CREATE DEFAULT CREATE INDEX CREATE PROCEDURE CREATE RULE CREATE TABLE CREATE TRIGGER DROP DATABASE DROP DEFAULT DROP INDEX DROP PROCEDURE DROP RULE DROP TABLE DROP TRIGGER DROP VIEW
GRANT RESTORE DATABASE RESTORE LOG REVOKE
TRUNCATE TABLE
由于系统表所存储数据的特殊性和重要性,所以建议用户不要自己在系统表上建立触发器。 在创建触发器时,不允许RETURN返回体现运行状态的数据。
【例2】创建一个当LWQK表执行INSERT、UPDATE *** 作时触发的触发器。
create trigger tr_products_insupd
on lwqk
for insert,update as
……
由于SQL Sever 支持在同一个表的同一种 *** 作类型上建立多个触发器,所以当建了tr_products_insupd触发器后,在LWQK表执行INSERT *** 作时将触发tr_products_insupd触发器,在执行UPDATE *** 作时将触发tr_product_update和tr_products_insupd触发器,他们都是有效的触发器。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)