触发器触发时,系统自动在内存中建立deleted表或inserted表,inserted表临时保存了插入或更新后的记录行,deleted表临时保存了删除或更新前的记录行,内存中建立的表只读,不容许修改,触发器执行完成后,自动删除。sql
delete触发器工做原理:第一步执行delete删除语句,删除表中的数据行,第二步触发delete删除触发器,向系统临时表的deleted表中插入被删除的副本,第三步触发器检查deleted中被删除的数据,肯定是否须要回滚或执行其余操做。数据库
不能使用SSMS数据库管理工具直接建立DML添加触发器,可使用T-SQL脚本建立DML添加触发器。编程
--声明数据库引用
use 数据库名;
go安全
--判断是否存在触发器,若是存在则删除
if exists(select * from sysobjects where name=触发器名)
drop trigger 触发器名;
go服务器
----建立新的删除触发器
create架构
--触发器标识符
triggerapp
--DML 触发器所属架构的名称。 DML 触发器的做用域是为其建立该触发器的表或视图的架构。 不能为 DDL 或登陆触发器指定
--[dbo.]函数
--触发器名称
[架构名.]触发器名工具
on性能
--对其执行 DML 触发器的表或视图,有时称为触发器表或触发器视图。 能够根据须要指定表或视图的彻底限定名称。 视图只能被 INSTEAD OF 触发器引用。 不能对局部或全局临时表定义 DML 触发器。
[架构名.]{ table | view}
with
--对CREATE TRIGGER 语句的文本进行模糊处理。使用WITH ENCRYPTION能够防止将触发器做为SQL Server复制的一部分进行发布。不能为 CLR 触发器指定 WITH ENCRYPTION。(指定此选项将为触发器加密)
encryption
--指示触发器已本机编译。 (只能应用于table)
--内存优化表上的触发器须要使用此选项。
native_compilation
--确保不能删除或更改触发器引用的表。(只能应用于table)
--内存优化表上的触发器须要使用此选项,但此选项不支持传统表上的触发器。
schemabinding
--EXECUTE AS (后面能够跟函数,存储过程等)
--指定用于执行该触发器的安全上下文。 容许您控制 SQL Server 实例用于验证被触发器引用的任意数据库对象的权限的用户账户。
--内存优化表上的触发器须要使用此选项。
[execute as clause]
--FOR | AFTER
--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的全部操做都已成功执行时才被触发。 全部的引用级联操做和约束检查也必须在激发此触发器以前成功完成。
--若是仅指定 FOR 关键字,则 AFTER 为默认值。
--不能对视图定义 AFTER 触发器。
{ for | after}
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器。 必须至少指定一个选项。 在触发器定义中容许使用上述选项的任意顺序组合。
--对于 INSTEAD OF 触发器,不容许对具备指定级联操做 ON DELETE 的引用关系的表使用 DELETE 选项。 一样,也不容许对具备指定级联操做 ON UPDATE 的引用关系的表使用 UPDATE 选项。
{ [insert] [,] [update] [,] [delete] }
--指定应该再添加一个现有类型的触发器。 WITH APPEND 不能与 INSTEAD OF 触发器一块儿使用。若是显式声明了 AFTER 触发器,则也不能使用该子句。
--仅当为了向后兼容而指定了 FOR 时(但没有 INSTEAD OF 或 AFTER)时,才能使用 WITH APPEND。 若是指定了 EXTERNAL NAME(即触发器为 CLR 触发器),则不能指定 WITH APPEND。
--with append
--指示当复制代理修改涉及到触发器的表时,不该执行触发器。
--not for replication
as
begin
sql_statement
end
end ;
go
--声明数据库引用
use testss;
go
--判断是否存在触发器,若是存在则删除
if exists(select * from sysobjects where name='deletetri')
drop trigger deletetri;
go
----建立新的删除触发器
create
--触发器标识符
trigger
--DML 触发器所属架构的名称。 DML 触发器的做用域是为其建立该触发器的表或视图的架构。 不能为 DDL 或登陆触发器指定
--[dbo.]
--触发器名称
dbo.deletetri
on
--对其执行 DML 触发器的表或视图,有时称为触发器表或触发器视图。 能够根据须要指定表或视图的彻底限定名称。 视图只能被 INSTEAD OF 触发器引用。 不能对局部或全局临时表定义 DML 触发器。
dbo.test1
with
--对CREATE TRIGGER 语句的文本进行模糊处理。使用WITH ENCRYPTION能够防止将触发器做为SQL Server复制的一部分进行发布。不能为 CLR 触发器指定 WITH ENCRYPTION。(指定此选项将为触发器加密)
encryption,
--指示触发器已本机编译。 (只能应用于table)
--内存优化表上的触发器须要使用此选项。
--native_compilation
--确保不能删除或更改触发器引用的表。(只能应用于table)
--内存优化表上的触发器须要使用此选项,但此选项不支持传统表上的触发器。
schemabinding
--EXECUTE AS (后面能够跟函数,存储过程等)
--指定用于执行该触发器的安全上下文。 容许您控制 SQL Server 实例用于验证被触发器引用的任意数据库对象的权限的用户账户。
--内存优化表上的触发器须要使用此选项。
--execute as clause
--FOR | AFTER
--AFTER 指定 DML 触发器仅在触发 SQL 语句中指定的全部操做都已成功执行时才被触发。 全部的引用级联操做和约束检查也必须在激发此触发器以前成功完成。
--若是仅指定 FOR 关键字,则 AFTER 为默认值。
--不能对视图定义 AFTER 触发器。
for
--{ [DELETE] [,] [INSERT] [,] [UPDATE] }
--指定数据修改语句,这些语句可在 DML 触发器对此表或视图进行尝试时激活该触发器。 必须至少指定一个选项。 在触发器定义中容许使用上述选项的任意顺序组合。
--对于 INSTEAD OF 触发器,不容许对具备指定级联操做 ON DELETE 的引用关系的表使用 DELETE 选项。 一样,也不容许对具备指定级联操做 ON UPDATE 的引用关系的表使用 UPDATE 选项。
delete
as
begin
declare @sss nvarchar(100)=null;
set @sss=(select top(1) name from deleted order by id desc)
if @sss is not null
begin
delete from dbo.test2 where id=(select id from dbo.test2 where name=@sss);
end
end ;
go
优势:
一、实现数据的级联删除操做。
二、不须要参数,不须要显示调用。
缺点:
一、若是不知道表中存在删除器,删除表中数据会形成没必要要的级联操做,形成数据丢失。
二、可移植性差。
三、占用服务器资源,给服务器形成压力。
四、执行速度主要取决于数据库服务器的性能与触发器代码的复杂程度。
五、触发器会使编程时源码的结构被迫打乱,为将程序修改、源码阅读带来困难。