SQL Server 触发器
-
SQL SERVER中有三类触发器FOR、AFTER、INSTEAD OF
1、AFTER 指定触发器仅在触发 SQL 语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。用英文简单理解就是 在...之后执行
2、FOR的理解就是与AFTER类同,即AFTER(FOR)
3、INSTEAD OF,在执行SQL语句前取代。INSREAD OF是指定执行 DML 触发器而不是触发 SQL 语句,因此,其优先级高于触发语句的操作。
-
FOR类的语法
CREATE TRIGGER tf_name --自定义触发器的名称
ON table --此处为表名,触发器的表名,意为在哪个表创建触发
FOR INSERT --触发类型:INSERT、UPDATE、DELETE;分别意为插入时、更新时、删除时触发,依据英文意思理解即可
AS
BEGIN
SET NOCOUNT ON --可有可无
DECLARE @.. ;--声明变量
select
insert
--相应的select语句,insert语句(update语句、delete语句)
SET NOCOUNT OFF--可有可无
END
GO
-
AFTER类的语法
CREATE TRIGGER tf_name
ON table
AFTER INSERT,UPDATE --定义都个触发,可以用逗号隔开
AS
BEGIN
SET NOCOUNT ON --可有可无
DECLARE @.. ;--声明变量
select
insert
...
--相应的select语句,insert语句(update语句、delete语句)
SET NOCOUNT OFF--可有可无
END
GO
-
INSTEAD OF类的语法
CREATE TRIGGER tf_name
ON table
INSTEAD OF INSERT --在表table中执行语句时,先执行此触发器的内容
AS
BEGIN
DECLARE @.. ;--声明变量
select
insert
...
--相应的select语句,insert语句(update语句、delete语句)
END
GO
END
插入型触发器的运用
-
--插入触发的应用,在表SL_NX中写入触发器,触发器名为SL_INSERT;
接着定义分别定义了3个变量,通过在SL_NX表中插入的临时表inserted找到@SL_NO,@OS_NO;接着再通过@OS_NO关联MP_OS表找到@OS_ID;最后将OS_ID、OS_NO、SL_NO插入另一张表MP_OS_Z中。以下代码是可以直接复制到后台,然后改对应的名呀,表呀就可以用的。
CREATE TRIGGER SL_INSERT --触发器名
ON SL_NX --表名
FOR INSERT --插入触发
AS
BEGIN
--定义变量OS_ID,OS_NO,SL_NO;并且插入MP_OS_Z表中,
DECLARE @OS_ID VARCHAR,@OS_NO VARCHAR,@SL_NO VARCHAR;
--在inserted表中查询已经插入的记录信息
SELECT @SL_NO=SL_NO,@OS_NO=PO_NO FROM inserted;--inserted是临时表,从插入临时表中查找对应的信息
SELECT @OS_ID=OS_ID FROM MP_OS WHERE OS_NO=@OS_NO;--查找关联的信息
INSERT INTO MP_OS_Z (OS_ID,OS_NO,SL_NO)VALUES (@OS_ID,@OS_NO,@SL_NO);--将相关信息插入另外一张表去
END
GO
-
INSTEAD OF类插入触发器
CREATE TRIGGER S_INSERT
ON SF_MN
INSTEAD OF INSERT
AS
BEGIN
DECLARE @CID VARCHAR(50),@REM VARCHAR
SELECT @CID=ID,@REM=REM FROM INSERTED
INSERT INTO MF_GJ (ID,REM) VALUES (@CID,@REM)
END
GO
-
更新类触发器的应用
CREATE TRIGGER ZL_UPDATE
ON ZL_NX
AFTER UPDATE
AS
BEGIN
UPDATE ZL_NX_Z SET REM=ZL_NX.REM FROM ZL_NX ZL INNER JOIN inserted i on ZL.ZL_NO=i.ZL_NO
END
GO
-
删除类触发器的应用
CREATE TRIGGER S_DELETE
ON SF_MN
INSTEAD OF DELETE
AS
BEGIN
DECLARE @CID VARCHAR(50)
--在deleted表中查询要删除的CID
SELECT @CID=ID FROM DELETED
--删除对应表的记录
DELETE TC_SM WHERE CID=@CID
DELETE SF_MN WHERE CID=@CID
END
-