SQL触发器语法参考

发表于:2010-8-09 14:59

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:david_5200    来源:51Testing软件测试网采编

  递归触发器

  当在 sp_dboption 中启用 recursivetriggers 设置时,SQL Server 还允许触发器的递归调用。

  递归触发器允许发生两种类型的递归:

  间接递归、直接递归

  使用间接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T2。在这种情况下,触发器 T2 将激发并更新T1。

  使用直接递归时,应用程序更新表 T1,从而激发触发器TR1,该触发器更新表 T1。由于表 T1 被更新,触发器 TR1再次激发,依此类推。

  下例既使用了间接触发器递归,又使用了直接触发器递归。假定在表 T1中定义了两个更新触发器 TR1 和 TR2。触发器 TR1 递归地更新表T1。Update 语句使 TR1 和 TR2 各执行一次。而 TR1 的执行将触发TR1(递归)和 TR2 的执行。给定触发器的 inserted 和 deleted表只包含与唤醒调用触发器的 Update 语句相对应的行。

  说明只有启用 sp_dboption 的 recursive triggers设置,才会发生上述行为。对于为给定事件定义的多个触发器,并没有确定的执行顺序。每个触发器都应是自包含的。

  禁用 recursive triggers设置只能禁止直接递归。若要也禁用间接递归,请使用 sp_configure 将nested triggers 服务器选项设置为 0。如果任一触发器执行了 ROLLBACK TRANSACTION语句,则无论嵌套级是多少,都不会进一步执行其它触发器。

  嵌套触发器

  触发器最多可以嵌套 32层。如果一个触发器更改了包含另一个触发器的表,则第二个触发器将激活,然后该触发器可以再调用第三个触发器,依此类推。如果链中任意一个触发器引发了无限循环,则会超出嵌套级限制,从而导致取消触发器。若要禁用嵌套触发器,请用sp_configure 将 nested triggers 选项设置为0(关闭)。默认配置允许嵌套触发器。如果嵌套触发器是关闭的,则也将禁用递归触发器,与sp_dboption 的 recursive triggers 设置无关。

  延迟名称解析

  SQL Server 允许 Transact-SQL存储过程、触发器和批处理引用编译时不存在的表。这种能力称为延迟名称解析。但是,如果Transact-SQL存储过程、触发器或批处理引用在存储过程或触发器中定义的表,则只有当兼容级别设置(通过执行sp_dbcmptlevel 设置)等于 65时,才会在创建时发出警告。如果使用批处理,则在编译时发出警告。如果引用的表不存在,将在运行时返回错误信息。有关更多信息,请参见延迟名称解析和编译。

  权限

  Create TRIGGER 权限默认授予定义触发器的表所有者、sysadmin固定服务器角色成员以及db_owner和db_ddladmin固定数据库角色成员,并且不可转让。

  若要检索表或视图中的数据,用户必须在表或视图中拥有 Select语句权限。若要更新表或视图的内容,用户必须在表或视图中拥有Insert、Delete 和 Update 语句权限。

  如果视图中存在 INSTEAD OF 触发器,用户必须在该视图中有Insert、Delete 和 Update 特权,以对该视图发出 Insert、Delete 和Update 语句,而不管实际上是否在视图上执行了这样的操作。

  示例

  A. 使用带有提醒消息的触发器

  当有人试图在 titles表中添加或更改数据时,下例将向客户端显示一条消息。说明消息 50009 是 sysmessages中的用户定义消息。有关创建用户定义消息的更多信息,请参见sp_addmessage。

USE pubs
IF EXISTS (Select name FROM sysobjects 
    Where name = 'reminder' AND type = 'TR') 
  Drop TRIGGER reminder
GO
Create TRIGGER reminder
ON titles
FOR Insert, Update
AS RAISERROR (50009, 16, 10)
GO

  B.使用带有提醒电子邮件的触发器

  当titles表更改时,下例将电子邮件发送给指定的人员(MaryM)。

USE pubs
IF EXISTS (Select name FROM sysobjects
   Where name = 'reminder' AND type = 'TR')
  Drop TRIGGER reminder
GO
Create TRIGGER reminder
ON titles
FOR Insert, Update, Delete
AS
 EXEC master..xp_sendmail'MaryM',
  'Don''t forget to print a report for the distributors.'
GO

64/6<123456>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号