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

问题

我有一个创建在表上的触发器,当对表执行一个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 ON dbo.Table1 FOR INSERT,UPDATE,DELETE
AS
IF OBJECT_ID('tempdb..#Disable') IS NOT NULL RETURN
PRINT 'Trigger Executed'
-- Actual code goes here
-- For simplicity, I did not include any code
GO

时间: 2024-12-31 02:40:54

在一个特定的SQL语句或会话中停用触发器的相关文章

sql 语句在sqlite 中重复执行

问题描述 sql 语句在sqlite 中重复执行 alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00); 语句在sqlite 中怎么重复执行 解决方案 你的意思是在表TL_Init中有两列BalYear? 解决方案二: 只能多次调用exec();我之前试过,类似 String sql = ""alter table TL_Init add BalYear FLOAT NOT NULL DEFAULT (0.00);a

数据-用sql语句在access中如何删除自动编号的那一行

问题描述 用sql语句在access中如何删除自动编号的那一行 今天又遇到了一个新问题:我尝试着用sql语句删除access中自动编号的一行,可是出错了,提示我数据类型不匹配.请问我应该怎么改写sql语句? String id=request.getParameter("ID");//从上个页面获取的ID int index=Integer.parseInt(id);//将id转换成字符串类型 . . String sql = "delete from tb_poll whe

sql语句查询数据库中的表名/列名/主键/自动增长值实例_MsSql

sql语句查询数据库中的表名/列名/主键/自动增长值 ----查询数据库中用户创建的表 ----jsj01 为数据库名 select name tablename from jsj01..sysobjects where type='U' and name not in ('dtproperties') --查询表里的字段信息 ---docs为表名 ---- select * from syscolumns where id = object_id('docs') ----查询数据库中所有类型

sql语句在c#中不能运行,但是在数据库中可以。

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.Data.SqlClient;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceConsoleApplication2{classProgram{staticvoidMain(string[]args){string[]TradingName={"CU0","AL0

SQL语句实现表中字段的组合累加排序

有表如下: id in out index 1 10 12 2 2 9 8 2 3 12 8 3 1 9 9 3 1 12 0 3 2 5 18 2 2 20 0 2 这三个字段均为integer类型 现要求如下: 1.按index=2查找 2.将所有id相同的和在一起,数据要加在一起 3.最后呈现的数据要按in+out进行排序,按由大到小 为满足以上的要求:设计的SQL语句如下(假设表名为tab) 复制代码 代码如下:select id,sum(in) as in,sum(out) as ou

不用SQL语句查询DataTable中的数据

数据|语句 在实际编程工程中,常常遇到这样的情况:DataTable并不是数据库中的,或者DataTable尚未写到数据库,或者从数据库中读出的DataTable已经在本地被改动,又没有写回数据库(可能还要作其他改动),在这些情况下,要查询DataTable中的数据,强大的SQL语言就派不上用场了. 有些.NET程序员采取在数据库中建立临时表等方法来解决这类查询问题.而我觉得这种方法不可行,其实只要用.NET类库中提供的DataView类的强大功能(主要是用它的RowFilter属性),就能方便

SQL语句在JavaScript中的应用

最近一直在用javascript在做项目  可是做着做着  感觉很多功能代码都是重复的.  比如对javascript数组的排序  还有对数组数据的删选以及分组  所以,后来兴致以上来.  一发不可收拾.  写了一个能在javascript中应用的 SQL 库  关于JSQL的开源问题 其实目前我已经在考虑这个问题 如果开源了,能有更多的好朋友一起来维护  JSQL 目前的大概结构是这样的  YESBRAIN - 命名空间           |          JSQL - 就是本类库啦!

SQL语句Left join 中On和Where的用法区别

原文地址:点击打开链接 SQL语句如下: SELECT * FROM 表1 LEFT JOIN 表2 ON 表1.id = 表2.id AND 表2.Name != 'ff' WHERE 表1.NAME != 'aa'        步骤1:返回笛卡尔积(SELECT * FROM 表1 CROSS JOIN 表2) 步骤2:应用ON筛选器(当前的条件为  表1.id = 表2.id AND 表2.Name != 'ff') 步骤3:添加外部行 这一步只对OUTER JOIN起作用,如果是LEF

JAVA无法执行SQL语句,在Postgresql中执行正常?不知道什么原因

问题描述 SQL语句如下:java中执行语句如下:sql="selectname,num,asText(geom)asgeom,addressfromhzpbwherehzpb.c_idin(selectc_idfromcitywherec_namelike'%江%')"rs=stmt.executeQuery(sql);在java中就是无值输出 解决方案 解决方案二:该回复于2009-04-13 13:08:35被版主删除解决方案三:子查询里没有值吧