我試圖在一個有觸發器的表中重命名列。我使用了SQL > Refactor > Rename來重命名該列。觸發器檔案也被更新。然而,當我發布時,我得到了這樣的結果:
程式TR_accrual_Accrual_Update,第134行 無效列名 'MinHoursRule'.
這是舊的列名。我假設發布者首先更新表,并看到當前/舊的觸發器仍有舊的列名。
是否有可能重命名一個列,更新觸發器,然后發布?
我真正能想到的唯一解決方案是這樣做的:
我認為這是對的。
- 洗掉觸發器并發布 重新命名這些列再次添加觸發器
- 發布 。
uj5u.com熱心網友回復:
這是我所做的作業:
這是我所做的作業。
- 添加新的列 。
- 留下舊的列 讓觸發器使用這兩組列。
- 發布/部署到prod不久
- 移除舊列
- 稍后發布/部署到prod 。
因此,我沒有重命名,而只是創建了新的列,然后最終洗掉了舊的列。
惡心。但它成功了。
注意:在我們的 C# 領域模型中,我只參考了新的列。
uj5u.com熱心網友回復:
我猜你在發布組態檔的設定上有問題。你可能禁用了一些東西,例如 "不要修改觸發器 "或類似的東西。我剛剛在VS 2019中創建了新的SSDT專案,結構如下:
CREATE TABLE [dbo].[test]
(
[Id] INT ,
b int int創建 TRIGGER [dbo].[Trigger_test].
ON [dbo].[test]。
FOR DELETE, INSERT, UPDATE.
AS[/span].
BEGIN BEGIN
SET NoCount ON
insert into test2 select b from inserted
END
去
創建 表 [dbo].[test2] 。
(
aint
)
GO
使用默認設定將專案發布到新的資料庫中,并向dbo.test表進行了一次插入。確保在dbo.test2表中有記錄。之后,我把dbo.test.b列重構為dbo.test.a,然后再次發布,一切正常。這是生成的腳本:
/*
trg_test的部署腳本
這段代碼是由一個工具生成的。
對該檔案的修改可能會導致不正確的行為,如果重新生成代碼,則會丟失。
代碼重新生成時將會丟失。
*/
GO
SET ANSI_NULLS, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, QUOTED_IDENTIFIER ON;
SET NUMERIC_ROUNDABORT OFF;
GO
:setvar 資料庫名稱 "trg_test"
:setvar DefaultFilePrefix "trg_test"
:setvar DefaultDataPath ""
:setvar DefaultLogPath ""
歸檔
:on error exit
GO
/*
檢測SQLCMD模式,如果不支持SQLCMD模式,則禁用腳本執行。
要在啟用SQLCMD模式后重新啟用腳本,請執行以下操作。
set noexec off;
*/
:setvar __IsSqlCmdEnabled "True"
去
如果N'$(__IsSqlCmdEnabled)' NOT LIKE N'True'BEGIN
PRINT N'SQLCMD模式必須啟用才能成功執行此腳本。'。
SET NOEXEC ON;
END
去
使用 [$(DatabaseName)]。
去
PRINT N'以下操作是從重構日志檔案80d0e5de-e188-465-b83c-18f38a1cec98'產生的。
PRINT N'重命名[dbo].[test].[b]為a'。
去
EXECUTE sp_rename @objname = N'[dbo]. [b], @newname = Na', @objtype = N'COLUMN';
去
PRINT N'Altering Trigger [dbo].[Trigger_test]...';
開始
ALTER TRIGGER [dbo].[Trigger_test].
ON [dbo].[test]。
FOR DELETE, INSERT, UPDATE.
AS[/span].
BEGIN BEGIN
SET NoCount ON
insert into test2 select a from inserted
END
去
--重構步驟,用部署的交易日志更新目標服務器。
如果OBJECT_ID(N'dbo.__RefactorLog') IS NULLBEGIN
CREATE TABLE [dbo]. [__RefactorLog] (OperationKey UNIQUEIDENTIFIER NOT NULL PRIMARY KEY)
EXEC sp_addextendedproperty N'microsoft_database_tools_support', N'refactoring log', N'schema', N'dbo', N'table', N'__RefactorLog')
結束。
去
如果NOT EXISTS (SELECT OperationKey FROM [dbo]. [__RefactorLog] WHERE OperationKey = '80d0e5d-e188-465-b83c-18f38a1cec98')
INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('80d0e5de-e188-465-b83c-18f38a1cec98')
GO
開始
PRINT N'更新完成'。
GO
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/334307.html
標籤:
上一篇:SQLServer中XQuery的Exist()子句中的多個條件
下一篇:部分繼承
