专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » 在特定的SQL语句或会话中停用触发器 »正文

在特定的SQL语句或会话中停用触发器

来源: 发布时间:星期四, 2008年10月9日 浏览:107次 评论:0
  我有一个创建在表上的触发器,当对表执行一个INSERT,DELETE或者UPDATE语句时,这个触发器将被激活执行。我想在一个特定的语句上阻止触发器被激活,而当执行其它语句时触发器仍然保持正常的执行状态。有没有一种方法可以动态做到这些?

  专家解答

  在某些时候,停用触发器是可能需要你去做的事情,尤其是你在一张表上执行管理员任务时。实现这点的最好方法是使用以下的命令去完全停用触发器。

  ALTER TABLE Table_Name DISABLE TRIGGER Trigger_Name

  尽管如此,如果你只想在一个特殊的语句上停用触发器,然而没有一种默认的机制来实现这一点,除非你开发一种自己的可编程的方法。使用这种方法只在某个特定语句上停用触发器而这个触发器在其他同时点击服务器的语句上继续被激活执行。

  即使有很多种方式去实现它,主要的逻辑在于传递一些信号给触发器,告诉触发器你不需要激活它执行。

  使用一张临时表

  实现这个任务最简单的方法是在你执行会激活触发器的语句之前先创建一张临时表。现在这个触发器将检查临时表存在与否,并且,如果这张临时表存在,那么触发器将会返回并且不执行代码,否则它将会像平常一样执行它的代码。

  为了看看执行过程,让我们来运行以下的语句来创建一张表和一个触发器。


  USE AdventureWorks;
  GO
  -- creating the table in AdventureWorks database
  IF OBJECT_ID('dbo.Table1') IS NOT NULL
  DROP TABLE dbo.Table1
  GO
  CREATE TABLE dbo.Table1(ID INT)
  GO
  -- Creating a trigger
  CREATE TRIGGER TR_Test _disibledevent= 0x55555
  RETURN
  PRINT 'Trigger Executed'
  -- Actual code goes here
  -- For simplicity, I did not include any code
  GO


  如果你想阻止触发器执行,那么你可以运行下面的代码:


  SET Context_Info 0x55555
  INSERT dbo.Table1 VALUES(100)


  执行INSERT语句之前,上下文信息设置成一个值。在这个触发器中,我们首先查看上下文信息的值与声明的值是否一样。如果是一样的,那么这个触发器将会仅做返回操作而不执行它的代码。要不然这个触发器将会被激活执行。

如果本文没有解决您的问题,请进老妖怪开发者社区提问

标签:

相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: