2012-03-01 83 views
4

我想在某些情况下绕过触发器,任何人都可以帮助我吗?如何绕过SQL Server 2008上的触发器

我试用了this link,但无法找到解决方案。

在此先感谢

+2

要做到这一点的唯一方法是暂时禁用触发器。如果它出现在桌面上并且处于活动状态,则无法绕过它。 – 2012-03-01 12:52:07

+0

ok msrv_s。但是如何暂时禁用触发器。你可以给我一个例子或一些代码。再次感谢。 – 2012-03-01 12:55:02

+1

(1)转到MSDN,SQL Server联机丛书,(2)搜索DISABLE TRIGGER - 您会在此处找到[此页](http://msdn.microsoft.com/zh-cn/library/ms189748。 aspx)这给你**所有**你需要的细节.....禁用:禁用触发器Person.uAddress ON Person.Address;'并重新启用:'ENABLE TRIGGER Person.uAddress ON Person.Address ;' – 2012-03-01 13:07:57

回答

6

你不能避免运行触发器。 你可以做的就是添加条件的,例如:

CREATE TRIGGER trigger_name 
    ON table 
    AFTER INSERT 
AS 
begin 
    IF (your condition) begin 
    --code 
    END 
end 

只是要小心,如果你有一个INSTEAD OF触发器。如果您没有编写插入代码,则表格中不会插入任何内容。

+0

感谢@diengo,但我有两个表tableA和tableB我的触发器无法处理多个记录更新。所以现在,因为我需要在tableA上更新大约100行,因此tableB上只有一条记录被更新(我的意思是一次触发是火灾)。在这种情况下,我想绕过一个触发器,我们将为tableA和tableB更新编写两个更新语句。谢谢 – 2012-03-01 12:52:28

+0

嗨manish! 我不明白。你可以说得更详细点吗?可能会提供一些示例 – Diego 2012-03-01 13:00:33

+0

Table_A(ID,Name,Date) Table_B(BID,Name) 我们在Table_A上为Update Table_B提供了写入器更新触发器。查看案例 更新表_A集名称='OB'其中(1,2,3,4,5,6,7,... 100)中的ID 只有一次触发器触发。 – 2012-03-01 13:08:17

3

@Manish:我不认为绕过触发器是最佳实践视角的好选择。相反,我会评估,考虑并过滤触发触发器所需的一系列条件。

2

您可以通过检查是否存在临时表来抑制触发器。需要抑制触发器的代码应创建一个临时表(例如#suppress_trigger)。在你的触发器中检查这个临时表的存在和返回。 示例:

CREATE TABLE [dbo].[dummy](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [Val] [char](1) NULL) 

--create a history table which gets populated through trigger 
CREATE TABLE [dbo].[dummy_hist](
[Id] [int] NULL, 
[Val] [char](1) NULL) 

CREATE TRIGGER [dbo].[trig_Insert] 
    ON [dbo].[dummy]  
    AFTER INSERT 
AS 
BEGIN 

    SET NOCOUNT ON; 
    if OBJECT_ID('tempdb..#Dummy_escape_trig') is not NULL 
     RETURN 

    INSERT INTO dummy_hist 
    SELECT * FROM inserted 

END 

--Proc for which trigger needs to be suppressed 
CREATE PROCEDURE [dbo].[ins_dummy] 
     @val AS CHAR(1) 
AS 
BEGIN 

    SET NOCOUNT ON;  

    CREATE TABLE #Dummy_escape_trig (id int) 

INSERT INTO dummy 
    VALUES(@val) 
END