SSDT不考虑触发器启用/禁用属性

问题描述 投票:2回答:2

我已经从现有数据库创建了一个SSDT项目。它在tablename.sql文件中包括现有触发器。

CREATE TABLE [dbo].[TableName] (
    [ID]        INT           NULL
)

GO

CREATE TRIGGER trgTableName ON dbo.TableName
FOR INSERT 
AS
BEGIN
 ....
END

GO

DISABLE TRIGGER [dbo].[trgTableName] ON [dbo].[TableName]; /* My trigger is currently disabled */
GO

但是,每当我修改触发器时,SSDT就会再次启用它。部署时不考虑触发器禁用属性。

无论如何,我是否可以获得SSDT来禁用触发器(如果已在数据库上将其禁用)?

我想的方法之一是添加为部署后脚本。但是,最好使用现有的SSDT功能代替手动添加部署后脚本。

编辑:如果我们更新它们,SQL Server似乎会自动启用触发器。就我而言,触发器有一个更新,因此可以启用触发器。但是,SSDT在更新后不会禁用它。

sql-server sql-server-data-tools
2个回答
1
投票

当然,一种方法是将其移动到PostDeploy。但是我建议创建一个存储过程:

CREATE PROCEDURE mysp_disable_triggers
AS
BEGIN
    DISABLE TRIGGER [dbo].[trgTableName] ON [dbo].[TableName];
END;

并在部署后脚本中调用它:

EXEC mysp_disable_triggers;

这样,您只有一个参考点,并且您的代码仍然经过验证(检查参考是否存在并且它是正确的SQL代码)。


要检查的第二种方法是使用ALTER TABLE语法:

CREATE TABLE [dbo].[TableName](...);
GO

CREATE TRIGGER [dbo].[trgTableName] ...;
GO

ALTER TABLE [dbo].[trgTableName] DISABLE TRIGGER [dbo].[TableName];

编辑:它不会改变行为。因此,PostDeploy方法似乎是可行的选择。


0
投票

如果您有一个庞大的难以管理的数据库,并且有很多这类的东西,那么您可能会很棘手,并创建一个过程来编写脚本,该过程可以捕获触发器的状态并将其还原。您可以在PreDeploy上运行该过程,然后在PostDeploy上运行生成的过程。像这样的东西:

create procedure dbo.scriptResetDisableTriggers as 
begin
    set nocount on
    declare 
        @sql nvarchar( max ),
        @n nvarchar( 2 ) = nchar(0x0d) + nchar(0x0a)

    select @sql =  
        N'create procedure dbo.resetDisabledTriggers as' + @n +
        N'begin' + @n +
        N'  set nocount on' + @n + @n;

    select @sql += 
        N'  begin try' + @n +
        N'    disable trigger ' +  tr.name + N' on table ' + s.name + N'.' +    t.name + @n +
        N'  end try' + @n +
        N'  begin catch' + @n +
        N'    print( error_message( ) ) -- or something else cool' + @n +
        N'  end catch' + @n + @n
    from 
        sys.triggers tr
        inner join
        sys.tables t
        on
            tr.parent_id = t.object_id
        inner join
        sys.schemas s
        on
            t.schema_id = s.schema_id
    where
        tr.is_disabled = 1

    select @sql +=  
        @n + N'  drop procedure dbo.resetDisabledTriggers' + @n +
        @n + N'end' + @n

    print ( @sql )
    execute sp_executesql  @sql

end
热门问题
推荐问题
最新问题