sql-server触发器
1、当删除学生表S中的某条记录时级联删除成绩表SC中相应的选课记录
CREATE TRIGGER a ON s
FOR DELETE
AS
DELETE sc FROM sc,deleted WHERE deleted.sno = sc,sno
2、用触发器实现只有S表中存在的学生才能在SC表中添加相应的选课记录
CREATE TRIGGER insert_sc1 ON sc
FOR INSERT
AS
IF(NOT EXISTS(SELECT s.sno FROM s,inserted WHERE s.sno = inserted.sno))
BEGIN
PRINT('该生不存在')
ROLLBACK
END
3、当在SC中插入选课记录,检查学生表S,若没有该生拒绝插入(法二)
CREATE TRIGGER insert_sc ON sc
FOR INSERT
AS
DECLARE @sid char(4)
DECLARE @sn char(10)
SELECT @sid = sno FROM inserted
SELECT @sn = sname FROM s WHERE sno = @sid
IF @sn is null
BEGIN
PRINT'不存在该生'
ROLLBACK TRANSACTION
END
GO
4、用触发器实现向视图V_SC(S#,SN,C#,G)做插入操作insert into V_SC values('s1','wang','c1',80)
CREATE TRIGGER t1 ON V_SC INSTEAD OF INSERT AS:
IF(NOT EXISTS(SELECT s# FROM s,INSERTED WHERE s.s# = inserted.s#))
INSERT INTO s(SELECT s#,sn FROM inserted)
IF(NOT EXISTS(SELECT s# FROM sc,inserted WHERE sc.s#=inserted.s# AND sc.c#=inserted.c#)
INSERT INTO sc(SELECT s#,c#,g FROM inserted))
MySql触发器
创建触发器语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
其中trigger_name标识触发器名称,用户自行指定;
trigger_time标识触发时机,用before和after替换;
trigger_event标识触发事件,用insert,update和delete替换;
tbl_name标识建立触发器的表名,即在哪张表上建立触发器;
trigger_stmt是触发器程序体;触发器程序可以使用begin和end作为开始和结束,中间包含多条语句;
1、DELIMITER |
CREATE TRIGGER t_trigger BEFORE INSERT ON t FOR EACH ROW
BEGIN SET @x = "hello trigger";
SET NEW.s1 = 55;
END;
|
2、DELIMITER |
CREATE TRIGGER pseudohash_crc_ins BEFORE INSERT ON pseudohash FOR EACH ROW
BEGIN SET @x = "hello trigger";
SET NEW.url_crc = crc32(NEW.url);
END;
|
CREATE TRIGGER pseudohash_crc_ins BEFORE UPDATE ON pseudohash FOR EACH ROW
BEGIN SET @x = "hello trigger";
SET NEW.url_crc = crc32(NEW.url);
END;
|
DELIMITER;
3、DELIMITER |
CREATE TRIGGER trig_useracct_update
AFTER UPDATE
ON SF_User.useracct FOR EACH ROW
BEGIN
IF OLD.ulevelid = 10101 OR OLD.ulevelid = 10104 THEN
IF NEW.ulevelid = 10101 OR NEW.ulevelid = 10104 THEN
if NEW.ustatid != OLD.ustatid OR NEW.exbudget != OLD.exbudget THEN
INSERT into FC_Output.fcevent set type = 2, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
end if;
ELSE
INSERT into FC_Output.fcevent set type = 1, tabid = 1, level = 1, userid = NEW.userid, ustatid = NEW.ustatid, exbudget = NEW.exbudget;
END IF;
END IF;
END;
|
上述触发器实例使用了OLD关键字和NEW关键字。OLD和NEW可以引用触发器所在表的某一列,在上述实例中,OLD.ulevelid表示表 SF_User.useracct修改之前ulevelid列的值,NEW.ulevelid表示表SF_User.useracct修改之后 ulevelid列的值。另外,如果是insert型触发器,NEW.ulevelid也表示表SF_User.useracct新增行的 ulevelid列值;如果是delete型触发器OLD.ulevelid也表示表SF_User.useracct删除行的ulevelid列原值。
另外,OLD列是只读的,NEW列则可以在触发器程序中再次赋值。
上述实例也使用了IF,THEN ,ELSE,END IF等关键字。在触发器程序体中,在beigin和end之间,可以使用顺序,判断,循环等语句,实现一般程序需要的逻辑功能。
查看触发器。查看触发器语法如下,如果知道触发器所在数据库,以及触发器名称等具体信息:
SHOW TRIGGERS from SF_User like "usermaps%"; //查看SF_User库上名称和usermaps%匹配的触发器
如果不了解触发器的具体的信息,或者需要查看数据库上所有触发器,如下:
SHOW TRIGGERS; //查看所有触发器
用上述方式查看触发器可以看到数据库的所有触发器,不过如果一个库上的触发器太多,由于会刷屏,可能没有办法查看所有触发器程序。这时,可以采用如下方式:
Mysql中有一个information_schema.TRIGGERS表,存储所有库中的所有触发器,desc information_schema. TRIGGERS,可以看到表结构。
删除触发器DROP TRIGGER trigger_name。