步骤1:禁用触发器
DISABLE TRIGGER Person.uAddress ON Person.Address;
http://msdn.microsoft.com/en-us/library/ms189748.aspx
第二步:完成操作
UPDATE Person.Address SET HouseNumber = REPLACE(HouseNumber, ' ', '');
步骤三:启用触发器
ENABLE Trigger Person.uAddress ON Person.Address;
http://msdn.microsoft.com/en-us/library/ms182706.aspx
-- 必须说明,使用时请谨慎!
你不能避免触发器被运行。 你可以在其中添加条件,例如:
CREATE TRIGGER trigger_name
ON table
AFTER INSERT
AS
begin
IF (your condition) begin
--code
END
end
如果你有一个INSTEAD OF触发器,请小心。如果你没有编写INSERT代码,表中将不会插入任何内容。
您可以通过检查临时表的存在来抑制触发器。需要抑制触发器的代码应该创建一个临时表(比如#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
@Manish:我认为从最佳实践的角度来看,绕过触发器并不是一个好选择。相反,我会评估、考虑并筛选出触发器触发所需的一组条件。
在生产环境中禁用触发器存在一些实际问题。我假设您将特别禁用表触发器(而不是数据库或服务器范围的触发器):
观点:虽然禁用/启用触发器很容易,但如果您在某些特定用例中暂时禁用它们作为并发管理策略的一部分,则需要注意许多考虑因素。
除非您对并发管理的细节相对熟悉,或者除非您绝对不需要代码可重入/并发,否则如果您使用DISABLE TRIGGER而不考虑这些因素,您将(可能是零星的)遇到问题。
考虑到所有情况,我能想到的最安全的方法是不禁用触发器,使用本地临时表作为只影响当前会话的信号量,仔细编写退出代码,以确保在受保护的代码结束时临时表被彻底销毁,正如已经建议的那样,但它仍然需要一个检查/阻止,即使只有在同一连接上,并且特别是在同一连接上并行执行时才会有影响。这种情况下绝对最安全的方法是为受保护的代码单独创建一个存储过程。该存储过程进行检查/阻止,然后如果它继续执行(在阻塞代码退出后,您需要检查死锁错误),则创建临时表。由于临时表在存储过程返回时被销毁,因此从受保护的代码中任何路径都将处理信号量。但是,临时表在整个会话中都可用 - 不仅在存储过程内部(当存储过程正在运行时),甚至不仅在批处理中。SQL Server支持单个会话上的并行查询,因此在会话的一个线程中创建的临时表在任何其他线程中都是可见的。这意味着它可以在存储过程之外,在同一会话中看到,实际上,此时可以运行相同的代码。这就是为什么在这种情况下仍然需要真正的并发管理。
最后,我为这个复杂的评论道歉。我发现几乎每次关于多线程和并发管理的讨论都会变成这样,因为虽然这些概念并不是很难,但编码实践长期以来一直被认为是微妙而脆弱的,并容易出现开发人员错误。Application Name=MyAppName;
,并在触发器中添加一个条件,使用 SQL APP_NAME 函数。IF(APP_NAME() = 'MyAppName')
DISABLE TRIGGER Person.uAddress ON Person.Address;
重新启用:ENABLE TRIGGER Person.uAddress ON Person.Address;
- marc_s