2017-03-20 20 views
1

我有以下腳本LoginLogo表:如何強制Microsoft數據庫項目爲主鍵約束生成ALTER語句而不是創建臨時表?

CREATE TABLE [LoginLogo] (
    [LoginLogoId]   INT    IDENTITY (1, 1) NOT NULL, 
    [LoginId]    INT    NOT NULL, 
    [LogoNm]    NVARCHAR(255)  NULL, 
    CONSTRAINT [PK_LoginLogo_LoginLogoId] PRIMARY KEY CLUSTERED ([LoginId] ASC), 
    CONSTRAINT [FK_LoginLogo_LoginId] FOREIGN KEY ([LoginId]) 
    REFERENCES [Login] ([LoginId]) 
); 

GO 
CREATE NONCLUSTERED INDEX [IF_LoginLogo_LoginId] 
    ON [LoginLogo]([LoginId] ASC) 
    ON [INDX]; 

我需要改變主鍵約束,所以我只是改變了一條線,請參閱下面的變化:

CONSTRAINT [PK_LoginLogo_LoginLogoId] PRIMARY KEY CLUSTERED ([LoginLogoId] ASC), 

數據庫項目完美構建更改的代碼,但是當它生成數據庫更新語句時,它會生成臨時表而不是簡單的ALTER語句。見下面生成的腳本:

CREATE TABLE [tmp_ms_xx_LoginLogo] (
    [LoginLogoId]  INT   IDENTITY (1, 1) NOT NULL, 
    [LoginId]   INT   NOT NULL, 
    [LogoNm]    NVARCHAR (255) NULL, 
    CONSTRAINT [tmp_ms_xx_constraint_PK_LoginLogo_LoginLogoId1] 
    PRIMARY KEY CLUSTERED ([LoginLogoId] ASC) 
); 

IF EXISTS (SELECT TOP 1 1 
      FROM [apps].[LoginLogo]) 
    BEGIN 
     SET IDENTITY_INSERT [apps].[tmp_ms_xx_LoginLogo] ON; 
     INSERT INTO [apps].[tmp_ms_xx_LoginLogo] ([LoginLogoId], [LoginId], [LogoNm]) 
     SELECT [LoginLogoId], 
       [LoginId], 
       [LogoNm], 
     FROM  [LoginLogo] 
     ORDER BY [LoginLogoId] ASC; 
     SET IDENTITY_INSERT [tmp_ms_xx_LoginLogo] OFF; 
    END 

DROP TABLE [LoginLogo]; 

EXECUTE sp_rename N'[tmp_ms_xx_LoginLogo]', N'LoginLogo'; 

EXECUTE sp_rename N'[tmp_ms_xx_constraint_PK_LoginLogo_LoginLogoId1]', 
N'PK_LoginLogo_LoginLogoId', N'OBJECT'; 

是否有可能告訴數據庫項目生成ALTER語句,而不是創建臨時表?我如何強制Microsoft數據庫項目來做到這一點?

回答

2

銘記,如果你改變一個表的聚集索引,表將被重建無論的腳本是否確實ALTER TABLE或臨時表的SSDT生成的東西,要解決這些問題,通常的方法是提前做ALTER

意思是,你需要一個腳本,通常被稱爲預先部署腳本(預先部署將不起作用,因爲它是運行後比較),使得昂貴更改,以便在運行比較時發生變化,因此不會由dacpac部署重複。

在執行任何sqlpackage之前,此腳本需要作爲部署運行的一部分運行。您可以在此腳本中將更改指定爲alter table

在這個特定的實例中,表格將以任何一種方式進行重建,但是我看不出它對總體部署時間造成很大的影響。

相關問題