gpt4 book ai didi

sql-server - 有没有办法仅针对特定的执行范围禁用 SQL Server 触发器?

转载 作者:行者123 更新时间:2023-12-01 18:44:55 24 4
gpt4 key购买 nike

在 SQL Server 2005 中,触发器是否有办法找出负责触发触发器的对象?我想用它来禁用一个存储过程的触发器。

是否有其他方法可以仅针对当前事务禁用触发器?我可以使用以下代码,但如果我没有记错的话,它也会影响并发事务 - 这将是一件坏事。

DISABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]

ENABLE TRIGGER { [ schema_name . ] trigger_name [ ,...n ] | ALL } ON { object_name | DATABASE | ALL SERVER } [ ; ]

如果可能,我希望避免在表中使用“NoTrigger”字段并执行 NoTrigger = null 的技术,因为我希望使表尽可能小。

我想避免触发器的原因是因为它包含对于手动更新表很重要的逻辑,但我的存储过程将处理这个逻辑。因为这将是一个高度使用的过程,所以我希望它能够快速。

Triggers impose additional overhead on the server because they initiate an implicit transaction. As soon as a trigger is executed, a new implicit transaction is started, and any data retrieval within a transaction will hold locks on affected tables.

来自:http://searchsqlserver.techtarget.com/tip/1,289483,sid87_gci1170220,00.html#trigger

最佳答案

我刚刚看到这篇文章最近在 SQL Server Central 时事通讯上突出显示,它似乎提供了一种使用连接上的 Context_Info 可能会觉得有用的方法:

http://www.mssqltips.com/tip.asp?tip=1591

<小时/>

由 Terrapin 编辑:

上面的链接包含以下代码:

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
DECLARE @Cinfo VARBINARY(128)
SELECT @Cinfo = Context_Info()
IF @Cinfo = 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)

关于sql-server - 有没有办法仅针对特定的执行范围禁用 SQL Server 触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/174600/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com