触发器

识触发器:

       触发器是同一种非常之贮存过程,它不可知吃显示的调用,而是在往表中插入记录,更改记录或去除记录时,被电动激活。在触发器中好查询其他表,也可以推行还扑朔迷离的T-SQL语句。如果履行的T-SQL语句执行了一个非法操作,则足以经过回滚事务使报告词不克尽,并回到事情执行前之状态,Microsoft
SQL Server
允许吗任何给定的 INSERT、UPDATEDELETE 语句子创建多独触发器。

触发器的意图:

◎触发器可以针对数据库进行级联修改

◎触发器可以形成比CKECK约束更扑朔迷离的界定

◎触发器可以窥见改变前后表中数量的两样,并基于这些不同来展开对应的操作。

◎对于一个表上的差操作(INSERT,UPDATE或者DELETE)可以应用不同之触发器,即使是对同一的言辞为足以调用不同之触发器完成不同之操作。

◎完成一定的事务规则。

 

 


语法:   CREATE TRIGGER trigger_name
ON { table | view }
[ WITH ENCRYPTION ]
{
    {
{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ ,
] [ UPDATE ] }
        [ WITH APPEND ]
        [ NOT FOR REPLICATION ]
        AS
        [ { IF UPDATE ( column )
            [ { AND | OR } UPDATE ( column ) ]
                [ …n ]
        | IF ( COLUMNS_UPDATED ( ) { bitwise_operator } updated_bitmask )
                { comparison_operator } column_bitmask [ …n ]
        } ]
        sql_statement [ …n ]
    }
}


AFTER
指定触发器只有当触发 SQL
语句被指定的富有操作都早就成施行后才激起。所有的援级联操作及自律检查吧须成功做到后,才能够实行是触发器。
只要单指定 FOR 关键字,则 AFTER 是默认设置。
莫能够以视图上定义 AFTER 触发器。
INSTEAD OF
点名执行触发器而未是推行触发 SQL 语句,从而替代触发语词之操作。
于表要视图上,每个 INSERT、UPDATE 或 DELETE 语词极多可定义一个 INSTEAD
OF 触发器。然而,可以以每个拥有 INSTEAD OF 触发器的视图上定义视图。
INSTEAD OF 触发器不可知当 WITH CHECK OPTION
的可是更新视图上定义。如果向指定了 WITH CHECK OPTION 选项的可更新视图添加
INSTEAD OF 触发器,SQL Server 将有一个左。用户须用 ALTER VIEW
删除该选项后才能够定义 INSTEAD OF 触发器。
{ [DELETE] [,] [INSERT] [,] [UPDATE] }
凡是指定在表要视图上实施怎样数据修改报告句时以激活触发器的重中之重字。必须至少指定一个选择。在触发器定义着允许行使以随机顺序组合的这些根本字。如果指定的挑选项多于一个,需用逗号分隔这些选择。
对于 INSTEAD OF
触发器,不允许以享有 ON DELETE
级联操作引用关系之表上使用 DELETE 选项。同样,也无允以具备 ON UPDATE 级联操作引用关系的表上使用
UPDATE 选项。


例1:

于Goods表中成立删除触发器,实现Goods表和Orders表中之级联删除。(注:这个力量于SQLSEVER2000以前只能用触发器完成)

 

CREATE TRIGGER GoodsDelete
ON Goods    –在其上执行触发器

AFTER DELETE
AS
DELETE FROM Orders
WHERE GoodsName IN
(SELECT Name FORM deleted)


例2:在Orders表上成立一个AFTER触发器,当为Orders表中插一行(加入一久订单记录)时,检查订单被的商品是否在整理中(查看相应货物在Goods表中之状态是不是也1),如果当打点中,则非可知产订单。

CREATE TRIGGER OrderInsert
ON Orders
AFTER INSERT
AS
IF(SELECT Status FROM Goods,Insertd WHERE Goods.Name=inserted.Name)=1
BEGIN
   PRINT ‘货物在整理中,不能够当Orders表中补充加该商品记录。’
   ROLLBACK
TRANSACTION
END


例3:在Orders表上树立一个安插触发器,在累加一个订单时,减少Goods表相应货品记录的库存量

CREATE TRIGGER OrdersInsert_1
ON Orders
AFTER INSERT
AS
UPDATE Goods SET Storage=Storage-inserted.Quantity
FROM Goods,inserted
WHERE Goods.Name=inserted.GoodsName

 


例4 限定Orders表的订单日期(OrderDate)不克手工修改。

CREATE TRIGGER OrderDataUpDat(e
ON Orders
AFTER UPDATE
IF UPDATE(OrderDate)
BEGIN
RAISERROR(‘不能够手动修改’,10,1)
ROLLBACK TRANSACTION
END

 


例5:判断要插入的订单中的商品名称在Goods表中是否是,如果不设有则回滚事务.

 

CREATE TRIGGER OrderInsert_2
ON Orders
AFTER INSERT
AS
IF (SELECT COUNT(*) FORM Goods,inserted
WHERE Goods.Name=inserted.GoodName)=0
BEGIN
PRINT(‘没有这种货物’)
ROLLBACK TRAINSACTION
END


例6:INSTEAD
OF触发器用于代替引起触发器执行的T-SQL语句。每当向SimpleCustomers视图执行INSERT语句时,Insertcustmer触发器被点,这时Inserted表中都生矣如果插入的数额,在Insertcustmer触发器的代码中,分析插入客户姓名的字符串,将那个分拆为姓氏和称两只字符串,并插入Customers表,而原来的INSERT语句不可知实施。

创建SimpleCustomers视图

由此SimpleCustomers视图向Customers表中上加记录

GO
CREATE VIEW SimpleCustomers(CustomerName,city,Tel)
AS
SELECT FistName+’,’+LastName,City,Tel
FROM Customers
GO
CREATE TIRGGER Insertcustmer
ON SimpleCustomers
INSTEAD OF INSERT
AS
DECLARE @Name varchar(40)
DECLARE @FistName varchar(20)
DECLARE @LastName varchar(20)
DECLARE @City varchar(20)
DECLARE @Tel
varchar(20)
DECLARE @idx
int
BEGIN
SELECT @Name=CustomerName,@City=City,@Tel=Tel
FROM inserted
SET @idx=CHARINDEX(‘,’,@Name)
SET @FistName=LEFT(@Name,@idx-1)
SET @LastNme=RIGHT(@Name,@LEN(@Name)-@idx)
INSERT INTO Customers
(FistName,LastName,City,Tel)
VALUES(@FistName,@LastName,@City,@Tel)
END


相关文章