SQL Server触发器的写法

触发器的概念很容易理解,可以简单地看成 事件-条件-动作规则。即特定的事件发生并满足条件,就执行动作,否则啥也不干。

但是触发器的写法不同的书却有很大区别,并且有些在SQL server 2008 R2上并不能执行,这里记录一种

insert / update / delete 触发器。

创建一个商品表GOODS,eg:

  1. CREATE TABLE GOODS(
  2. Gno char(4) PRIMARY KEY,
  3. Gname char(10),
  4. Price int);

1. INSERT触发器

为表GOODS建立一个INSERT触发器,当插入商品的价格高于9999时,拒绝插入(回滚,撤销插入事务)

向目标表中插入数据时,会触发该表的Insert 触发器,系统自动在内存中创建inserted表,存放要(已 ,取决于after/before)插入的数据。

  1. CREATE TRIGGER TRI_INSERT ON GOODS
  2. AFTER INSERT
  3. AS
  4. BEGIN
  5. Declare @pri int;
  6. Select @pri=Price From inserted
  7. IF(@pri > 9999)
  8. Begin
  9. print('太贵了,价格应小于9999')
  10. rollback
  11. END
  12. END

测试触发器:

  1. INSERT INTO GOODS
  2. VALUES('1','大白菜','3')

成功执行;

  1. INSERT INTO GOODS
  2. VALUES('2','菲力牛排','19999')

拒绝插入(插入事务被撤销)

2. Update触发器

在目标表中更新数据时,会触发该表的Update 触发器,系统自动在内存中创建deleted表和inserted表,deleted表存放的是更新前的数据,inserted表存放的是更新后的数据。

  1. CREATE TRIGGER TRI_UPDATE ON GOODS
  2. AFTER UPDATE
  3. AS
  4. BEGIN
  5. Declare @pri int;
  6. Select @pri=Price From inserted
  7. IF(@pri > 9999)
  8. Begin
  9. print('太贵了,价格应小于9999')
  10. rollback
  11. END
  12. ELSE
  13. Begin
  14. Select *
  15. From deleted
  16. Select *
  17. From inserted
  18. END
  19. END

测试:

  1. UPDATE GOODS
  2. SET Price = 6
  3. WHERE Gname = '大白菜'

3. Delete触发器

从目标表中删除数据时,会触发该表的Delete 触发器,系统自动在内存中创建deleted表,存放删除的数据。

  1. Create TRIGGER TRI_DELETE ON GOODS
  2. AFTER DELETE
  3. AS
  4. BEGIN
  5. print('删了就删了吧~')
  6. END

4. 混合触发器

以逗号隔开

  1. CREATE TRIGGER TRI_UPDATE ON GOODS
  2. AFTER UPDATE,INSERT

顺便留下while的用法:

  1. declare @i int
  2. set @i=1
  3. while @i<50
  4. begin
  5. insert into test (Cno,Cname) values(@i,'DcM')
  6. set @i=@i+1
  7. end
(0)

相关推荐