gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 16:35:06 25 4
gpt4 key购买 nike

我已经从现有数据库创建了一个 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 服务器似乎会自动启用触发器。就我而言,触发器有更新,因此它启用了触发器。但是,SSDT 不会在更新后禁用它。

最佳答案

一种方法当然是将其移动到 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 apporach 似乎是可行的选择。

关于sql-server - SSDT 不考虑触发器启用/禁用属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62196958/

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