SQL Server触发器的分类

SQL触发器详解
本文介绍了SQL触发器的不同类型,包括数据库级、表级、行级和语句级触发器的区别。并提到了SQL Server 2008中DML触发器、DDL触发器和登录触发器的分类,以及其子类如After触发器、Insteadof触发器等。
1.根据触发器触发事件的级别可分为:数据库级触发器和表级触发器,表级触发器又可分为:行级触发器和语句级触发器,行级触发器对处理中每一行都执行一次。语句级触发器对每个处理执行一次,可以同时执行多行语句。(例:如果一条INSERT语句在TABLE表中插入500行,那么这个表上的语句级触发器只执行一次,而行级的触发器就要执行500次)[color=red]注:SQL2005不支持SELECT触发器、行级触发器和Before触发器。[/color]
2.SQL Server2008联机丛书上的分类为DML触发器,DDL触发器和登录触发器
其中DML触发器又分为:After触发器;Instead of触发器;CLR触发器(未完待续)
SQL Server 中,触发器主要分为以下几类: ### DML 触发器 DML(Data Manipulation Language,数据操作语言)触发器是最常见的触发器类型,当对表执行 `INSERT`、`UPDATE` 或 `DELETE` 操作时会触发。根据触发时间,DML 触发器又可分为 `AFTER` 触发器 `INSTEAD OF` 触发器: - **`AFTER` 触发器**:在触发它的 `INSERT`、`UPDATE` 或 `DELETE` 语句成功执行之后才被激活并执行其内部的 SQL 代码。常用于在数据已经被插入、更新或删除之后,执行一些额外的操作,比如记录日志、更新相关表的数据等。以下是一个 `AFTER` 触发器的示例,在 `PPSOCCURRENCE` 表进行 `DELETE`、`INSERT` 或 `UPDATE` 操作后,将相关信息记录到 `bomline_change_log` 表中: ```sql CREATE TRIGGER [dbo].[trg_PPSOCCURRENCE_AfterUpdate] ON [dbo].[PPSOCCURRENCE] AFTER DELETE,INSERT,UPDATE AS BEGIN IF EXISTS (SELECT * FROM deleted d) BEGIN INSERT INTO [dbo].[bomline_change_log] ([occ_id],[rparent_bvru] ,[pseq_no] ,[porder_no],[pqty_value],[log_type],[change_time],[change_user],[v9_bit_number],[rchild_itemu] ) SELECT d.puid,rparent_bvru,pseq_no,porder_no,pqty_value,'delete',GETDATE(),f.puser_name,b.pval,d.rchild_itemu FROM deleted d LEFT JOIN PV9_BIT_NUMBER b on d.puid=b.puid INNER JOIN PPOM_APPLICATION_OBJECT e on d.rparent_bvru=e.puid INNER JOIN PPOM_USER f on e.rlast_mod_useru = f.puid END IF EXISTS (SELECT * FROM inserted i) BEGIN INSERT INTO [dbo].[bomline_change_log] ([occ_id],[rparent_bvru] ,[pseq_no] ,[porder_no],[pqty_value],[log_type],[change_time],[change_user],[v9_bit_number],[rchild_itemu] ) SELECT i.puid,rparent_bvru,pseq_no,porder_no,pqty_value,'insert',GETDATE(),f.puser_name,b.pval ,i.rchild_itemu FROM inserted i LEFT JOIN PV9_BIT_NUMBER b on i.puid=b.puid INNER JOIN PPOM_APPLICATION_OBJECT e on i.rparent_bvru=e.puid INNER JOIN PPOM_USER f on e.rlast_mod_useru = f.puid END END GO ``` - **`INSTEAD OF` 触发器**:用于替代触发它的 `INSERT`、`UPDATE` 或 `DELETE` 语句的执行。可以在数据被实际插入、更新或删除之前,对操作进行一些额外的验证或修改。例如,在对视图进行 `INSERT` 操作时,可以使用 `INSTEAD OF` 触发器将插入操作转换为对基表的插入操作。 ### DDL 触发器 DDL(Data Definition Language,数据定义语言)触发器是为响应各种 DDL 事件而激发的触发器。这些事件包括 `CREATE`、`ALTER`、`DROP` 等语句。DDL 触发器可用于管理数据库架构的更改,例如限制用户对某些表或数据库对象的修改。以下是一个简单的 DDL 触发器示例,当尝试删除表时,会记录相关信息并阻止删除操作: ```sql CREATE TRIGGER prevent_table_drop ON DATABASE FOR DROP_TABLE AS BEGIN DECLARE @EventData XML = EVENTDATA(); INSERT INTO DDL_Change_Log (EventType, SQLCommand, EventTime) VALUES ( @EventData.value('(/EVENT_INSTANCE/EventType)[1]', 'NVARCHAR(100)'), @EventData.value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'NVARCHAR(MAX)'), GETDATE() ); ROLLBACK TRANSACTION; END; ``` ### 登录触发器 登录触发器将为响应 `LOGIN` 事件而激发存储过程。与 SQL Server 实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。因此,来自触发器内部且通常将到达用户的所有消息(例如错误消息来自 `PRINT` 语句的消息)会传送到 SQL Server 错误日志。如果身份验证失败,将不激发登录触发器 [^3]。以下是一个简单的登录触发器示例: ```sql CREATE TRIGGER login_trigger ON ALL SERVER FOR LOGIN AS BEGIN -- 可以在这里添加登录验证逻辑 -- 例如,限制特定用户在特定时间登录 IF USER_NAME() = 'restricted_user' AND DATEPART(HOUR, GETDATE()) BETWEEN 22 AND 6 BEGIN ROLLBACK TRANSACTION; END END; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值