×

SQL SERVER Trigger 触发器_sqlserver trigger

前端技术网 前端技术网 发表于2024-01-23 00:09:31 浏览1190 评论0

抢沙发发表评论

一、SQLSERVER中触发器的触发类型有几种

SQL SERVER中触发器的触发类型有三种。

1、DML触发器,当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果对该表写了对应的DML触发器,那么该触发器自动执行。

SQL SERVER Trigger 触发器_sqlserver trigger

2、DDL触发器,是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改。

3、登录触发器,登录触发器将为响应 LOGIN事件而激发存储过程。与 SQL Server实例建立用户会话时将引发此事件。登录触发器将在登录的身份验证阶段完成之后且用户会话实际建立之前激发。

扩展资料:

DML触发器的主要作用在于强制执行业务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。

来自登录触发器内部且通常将到达用户的所有消息(例如错误消息和来自 PRINT语句的消息)会传送到 SQL Server错误日志。如果身份验证失败,将不激发登录触发器。

触发器可在写入数据表前,强制检验或转换数据。触发器发生错误时,异动的结果会被撤销。可依照特定的情况,替换异动的指令(INSTEAD OF)。

SQL SERVER Trigger 触发器_sqlserver trigger

二、请教如何使用SQL的触发器 数据库是MSSQLSERVER

当触发INSERT触发器时,新的数据行就会**入到触发器表和inserted表中。inserted表是一个逻辑表,它包含了已经插入的数据行的一个副本。inserted表包含了INSERT语句中已记录的插入动作。inserted表还允许引用由初始化INSERT语句而产生的日志数据。触发器通过检查inserted表来确定是否执行触发器动作或如何执行它。inserted表中的行总是触发器表中一行或多行的副本。

日志记录了所有修改数据的动作(INSERT、UPDATE和DELETE语句),但在事务日志中的信息是不可读的。然而,inserted表允许你引用由INSERT语句引起的日志变化,这样就可以将插入数据与发生的变化进行比较,来验证它们或采取进一步的动作。也可以直接引用插入的数据,而不必将它们存储到变量中。

示例

在本例中,将创建一个触发器。无论何时订购产品(无论何时向Order Details表中插入一条记录),这个触发器都将更新Products表中的一列(UnitsInStock)。用原来的值减去订购的数量值即为新值。

===========================================================

USE Northwind

CREATE TRIGGER OrdDet_Insert

ON [Order Details]

FOR INSERT

AS

UPDATE P SET

UnitsInStock= P.UnitsInStock– I.Quantity

FROM Products AS P INNER JOIN Inserted AS I

ON P.ProductID= I.ProductID

===========================================================

DELETE触发器的工作过程

当触发DELETE触发器后,从受影响的表中删除的行将被放置到一个特殊的deleted表中。deleted表是一个逻辑表,它保留已被删除数据行的一个副本。deleted表还允许引用由初始化DELETE语句产生的日志数据。

使用DELETE触发器时,需要考虑以下的事项和原则:

·当某行被添加到deleted表中时,它就不再存在于数据库表中;因此,deleted表和数据库表没有相同的行。

·创建deleted表时,空间是从内存中分配的。deleted表总是被存储在高速缓存中。

·为DELETE动作定义的触发器并不执行TRUNCATE TABLE语句,原因在于日志不记录TRUNCATE TABLE语句。

示例

在本例中,将创建一个触发器,无论何时删除一个产品类别(即从Categories表中删除一条记录),该触发器都会更新Products表中的Discontinued列。所有受影响的产品都标记为1,标示不再使用这些产品了。

===========================================================

USE Northwind

CREATE TRIGGER Category_Delete

ON Categories

FOR DELETE

AS

UPDATE P SET Discontinued= 1

FROM Products AS P INNER JOIN deleted AS d

ON P.CategoryID= d.CategoryID

===========================================================

UPDATE触发器的工作过程

可将UPDATE语句看成两步操作:即捕获数据前像(before image)的DELETE语句,和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。

触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。

可以使用IF UPDATE语句定义一个监视指定列的数据更新的触发器。这样,就可以让触发器容易的隔离出特定列的活动。当它检测到指定列已经更新时,触发器就会进一步执行适当的动作,例如发出错误信息指出该列不能更新,或者根据新的更新的列值执行一系列的动作语句。

语法

===========================================================

IF UPDATE(<column_name>)

===========================================================

例1

本例阻止用户修改Employees表中的EmployeeID列。 www.aspxuexi.com

===========================================================

USE Northwind

GO

CREATE TRIGGER Employee_Update

ON Employees

FOR UPDATE

AS

IF UPDATE(EmployeeID)

BEGIN

RAISERROR('Transaction cannot be processed.\

***** Employee ID number cannot be modified.', 10, 1)

ROLLBACK TRANSACTION

END

===========================================================

INSTEAD OF触发器的工作过程

可以在表或视图上指定INSTEAD OF触发器。执行这种触发器就能够替代原始的触发动作。INSTEAD OF触发器扩展了视图更新的类型。对于每一种触发动作(INSERT、UPDATE或 DELETE),每一个表或视图只能有一个INSTEAD OF触发器。

INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。例如,通常不能在一个基于连接的视图上进行DELETE操作。然而,可以编写一个INSTEAD OF DELETE触发器来实现删除。上述触发器可以访问那些如果视图是一个真正的表时已经被删除的数据行。将被删除的行存储在一个名为deleted的工作表中,就像AFTER触发器一样。相似地,在UPDATE INSTEAD OF触发器或者INSERT INSTEAD OF触发器中,你可以访问inserted表中的新行。

不能在带有WITH CHECK OPTION定义的视图中创建INSTEAD OF触发器。

示例

在本例中,创建了一个德国客户表和一个墨西哥客户表。放置在视图上的INSTEAD OF触发器将把更新操作重新定向到适当的基表上。这时发生的插入是对CustomersGer表的插入而不是对视图的插入。 www.aspxuexi.com

创建两个包含客户数据的表:

===========================================================

SELECT* INTO CustomersGer FROM Customers WHERE Customers.Country='Germany'

SELECT* INTO CustomersMex FROM Customers WHERE Customers.Country='Mexico'

GO

===========================================================

在该数据上创建视图:

===========================================================

CREATE VIEW CustomersView AS

SELECT* FROM CustomersGer

UNION

SELECT* FROM CustomersMex

GO

===========================================================

创建一个在上述视图上的INSTEAD OF触发器:

===========================================================

CREATE TRIGGER Customers_Update2

ON CustomersView

INSTEAD OF UPDATE AS

DECLARE@Country nvarchar(15)

SET@Country=(SELECT Country FROM Inserted)

IF@Country='Germany'

BEGIN

UPDATE CustomersGer

SET CustomersGer.Phone= Inserted.Phone

FROM CustomersGer JOIN Inserted

ON CustomersGer.CustomerID= Inserted.CustomerID

END

ELSE

IF@Country='Mexico'

BEGIN

UPDATE CustomersMex

SET CustomersMex.Phone= Inserted.Phone

FROM CustomersMex JOIN Inserted

ON CustomersMex.CustomerID= Inserted.CustomerID

END

===========================================================

通过更新视图,测试触发器:

===========================================================

UPDATE CustomersView SET Phone=' 030-007xxxx'

WHERE CustomerID='ALFKI'

SELECT CustomerID, Phone FROM CustomersView

WHERE CustomerID='ALFKI'

SELECT CustomerID, Phone FROM CustomersGer www.aspxuexi.com

WHERE CustomerID='ALFKI'

===========================================================

那么具体的讲,对于多列数据,如何计算方差呢?:

===========================================================

CREATE TRIGGER [calT1T2T3] ON dbo.DCLB

FOR INSERT,UPDATE

AS

update P

SET

/**//*

计算方差的触发器

*/

P.T1=(I.P1+I.P2+I.P3+I.P4+I.P5+I.P6),

P.T2=(I.Y1+I.Y2+I.Y3+I.Y4+I.Y5+I.Y6), www.aspxuexi.com

P.T3=SQRT(P.T1*P.T1+P.T2*P.T2)

FROM DCLB AS P INNER JOIN Inserted AS I

ON P.SID= I.SID

===========================================================

触发器的使用很方便,而且也很简单,重要的是理解inserted过程。可将UPDATE语句看成两步操作:即捕获数据前像(before image)的DELETE语句,和捕获数据后像(after image)的INSERT语句。当在定义有触发器的表上执行UPDATE语句时,原始行(前像)被移入到deleted表,更新行(后像)被移入到inserted表。触发器检查deleted表和inserted表以及被更新的表,来确定是否更新了多行以及如何执行触发器动作。

三、sqlserver 中创建触发器execute master有什么作用

触发器是一种特殊类型的存储过程,对特定事件作出相应。触发器有两种类型:数据定义语言(DDL)触发器和数据操纵语言(DML)触发器。

DDL触发器在用户以某些方式(CREATE、ALTER、DROP或相似的语句)对数据库结构进行修改时激活作出响应。一般来说,只会在对数据库结构的改变或历史进行极为严格的审计时才会用到DDL触发器。

DML触发器是一些附加在特定表或视图上的代码片段。与需要显式调用代码的存储过程不同,只要有附加触发器的时间在表中发生,触发器中的代码就会自动运行。实际上也不能显式地调用触发器-唯一的做法是在指定的表中执行所需的操作。

除了不能够显式地调用触发器,还可在存储过程中发现另外两个触发器所没有的内容:参数和返回码。

可将触发器附加到什么事件呢?因为在SQL中可以使用3类动作查询,所以就有3种类型的触发器,另外加上混合搭配这些时间并对时间定时激活的混合触发器类型。

INSERT触发器

DELETE触发器

UPDATE触发器

以后任意类型的混合

注意:

值得注意的是,有时即使执行的动作是前面这些类型中的一种,触发器也不会激活。问题在于进行的操作是否在记录的活动中。例如,DELETE语句是一个正常的记录活动,它会激活任何删除触发器,而TRUNCATE TABLE也有删除行的作用,但只是把表使用的空间释放而已-没有记录单个行删除操作,所以没有激活任何触发器。批量操作默认情况下不激活触发器,需要显式告知批量操作激活触发器。

创建触发器的语法:

CREATE TRIGGER<trigger name>

ON [<schema name>. ]<table or view name>

[WITH ENCRYPTION| EXECUTE AS<CALLER| SELF|<user>> ]

{{{ FOR| AFTER}< [DELETE][,][INSERT][,][UPDATE]>}| INSTEAD OF}[WITH APPEND][NOT FOR REPLICATION]

AS

<<sql statements>| EXTERNAL NAME<assembly method specifier>>

ON子句用来之处触发器将要附加的表,以及在何时何种情况下激活这个触发器。

1、ON子句

这部分只是对创建触发器所针对的对象进行命名。记住,如果触发器的类型是AFTER触发器(使用FOR或AFTER来声明触发器),那么ON子句的目标就必须是一个表-AFTER触发器不支持视图。

2、WITH ENCRYPTION选项

加密触发器。如果添加了这个选项,则可以确保没有人能够查看你的代码(甚至是你自己)。和视图与存储过程一样,使用WITH ENCRYPTION选项需要记住的是,每次在触发器上使用ALTER语句时都必须重新应用该选项,如果使用ALTER STATEMENT语句但不包含WITH ENCRYPTION选项,那么触发器就不再被加密。

3、FOR|AFTER子句与INSTEAD OF子句

除了要确定激活触发器(INSERT、UPDATE、DELETE)的查询类型以外,还要对触发器的激活时间做出选择。虽然人们经常考虑使用FOR触发器,但是也可以使用INSTEAD OF触发器。对着两个触发器的选择将会影响到是在修改数据之前还是之后进入触发器。FOR和AFTER的意义是一样的。

FOR|AFTER

FOR(或者AFTER)子句表明了期望触发器在何种动作类型下激活。当有INSERT、UPDATE或DELETE或三者混合操作时,都可以激活触发器。

FOR INSERT,DELETE

--或者是:

FOR UPDATE,INSERT

--或者是:

FOR DELETE

1、INSERT触发器

当有人向表中插入新的一行时,被标记为FOR INSERT的触发器的代码就会执行。对于插入的每一行来说,SQL Server会创建一个新行的副本并把该副本插入到一个特殊的表中,该表只在触发器的作用域内存在,该表被称为Inserted表。特别需要注意的是,Inserted表只在触发器激活时存在。在触发器开启之前或完成之后,都要认为该表示不存在的。

2、DELETE触发器

它和INSERT触发器的工作方式相同,只是Inserted表示空的(毕竟是进行删除而非插入,所以对于Inserted表示没有记录)。相反,每个被删除的记录的副本将会插入到另一个表中,该表称为Deleted表,和Inserted表类似,该表只存在于触发器激活的时间内。

3、UPDATE触发器

除了有一点改变以外,UPDATE触发器和前面的触发器是很类似的。对表中现有的记录进行修改时,都会激活被声明FOR UPDATE的触发器的代码。唯一的改变是没有UPDATE表。SQL Server认为每一行好像删除了现有记录,并插入了全新的记录。声明为FOR UPDATE的触发器并不是只包含一个表,而是两个特殊的表,称为Inserted表和Deleted表。当然,这两个表的行数是完全相同。

4、WITH APPEND选项

WITH APPEND选项并不常用,老实讲,用到它的可能性很小;WITH APPEND选项只能应用于6.5兼容模式中。

如果已经声明了一个称为trgCheck的触发器在更新和插入时强制执行数据完整性,那么就不能创建另一个触发器来进行级联更新。一旦创建了更新(或插入、删除)触发器,那么就不能创建另一个同一动作类型的触发器。为解决这个问题,WITH APPEND子句显式地告诉SQL Server,即使在表上已经有了这种类型的触发器,还可以添加一个新的触发器。当有合适的触发动作(INSERT、UPDATE、DELETE)发生时,会同时激活两个触发器。

5、NOT FOR REPLICATION选项

如果添加了该选项,会稍微地改变关于何时激活触发器的规则。在适当的位置使用这个选项,无论与**相关的任务何时修改表,都不会激活触发器。通常,当修改了原始表,并且不会再进行修改的时候会激活触发器(进行内务处理或级联等操作)。

6、AS子句

和在存储过程中的使用完全相同,这正是触发器的实质所在。AS关键字告诉SQL Server,代码将要启动。

附上出处链接:http://www.cnblogs.com/kissdodog/p/3173421.html

感谢您的阅读!希望本文对解决您关于SQL SERVER Trigger 触发器_sqlserver trigger的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。