2017-10-24 7 views
0

DBA.StackExchangeにこれを行ってもよいかどうかわかりませんが、私は、既存のバックエンドデータベーステーブルに既存の列I、J、およびKを持つ列を追加する必要があるソフトウェア開発者です)。これにより、私の新しいフロントエンドコードが機能するようになりました。テーブルには、他の関連するテーブルU、Vを参照する2つの既存の外部キーFK_T_UとFK_T_Vがあります。私は、3つの新しい真偽BITカラム(X、Y、Z)をテーブルに追加していますが、これをする。十分に簡単!私はSQL Server 2014を使用しています。ソース・リポジトリには既にCREATE TABLEスクリプトがあります。IF EXISTSとELSE文で囲み、ALTER TABLEシーケンスを真中に挿入します。このように、将来の再デプロイメントは単に既存のテーブルを変更することも、実際には存在しない場合は作成することもできます。良いアイデア?私はそこに行くのが少し難しいので、私はStackOverflowの助けを求めることによってこの努力をスピードアップすると思った。あなたの援助は非常に高く評価されます!ここでは、既存のスクリプトを作成し、[作業]です:テーブルが存在しない場合はテーブルを作成するスクリプトの正しいSQL Server構文は何ですか?それ以外の場合は、新しい列を追加するには変更しますか?

BEGIN TRANSACTION 
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[T]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
drop table [dbo].[T] 
CREATE TABLE [dbo].[T] (
    [I] [int] IDENTITY (1, 1) NOT NULL , 
    [CourseK] [int] NULL , 
    [I] [int] NOT NULL , 
    [K] [int] NULL , 
    CONSTRAINT [PK_T] PRIMARY KEY CLUSTERED 
    (
     [I] 
    ) ON [PRIMARY] 
) ON [PRIMARY] 
GRANT SELECT ON [dbo].[T] TO [OtherApplication] 
GRANT SELECT , INSERT ON [dbo].[T] TO [AnotherApplication] 

ALTER TABLE [dbo].[T] WITH NOCHECK ADD CONSTRAINT [FK_T_U] FOREIGN KEY 
    (
     [K] 
    ) REFERENCES [U] (
     [K] 
    ) 

ALTER TABLE [dbo].[T] WITH NOCHECK ADD CONSTRAINT [FK_T_V] FOREIGN KEY 
    (
     [I] 
    ) REFERENCES [V] (
     [I] 
    ) 

COMMIT TRANSACTION 
+0

あなたは将来的にはDACPACを使用して検討する必要があります、このインクリメンタルな展開を容易にするためのものです.. https://www.red-gate.com/simple-talk/sql/database-delivery/microsoft-and-database-lifecycle-management-dlm-the-dacpac/ –

答えて

1
BEGIN TRANSACTION 

IF NOT EXISTS (SELECT * FROM sys.tables t WHERE t.name='T') 
BEGIN 
    CREATE TABLE [dbo].[T] (
     [I] [int] IDENTITY (1, 1) NOT NULL , 
     [CourseK] [int] NULL , 
     [I] [int] NOT NULL , 
     [K] [int] NULL , 
     CONSTRAINT [PK_T] PRIMARY KEY CLUSTERED 
     (
     [I] 
     ) ON [PRIMARY] 
    ) ON [PRIMARY] 
    GRANT SELECT ON [dbo].[T] TO [OtherApplication] 
    GRANT SELECT , INSERT ON [dbo].[T] TO [AnotherApplication] 

    ALTER TABLE [dbo].[T] WITH NOCHECK ADD CONSTRAINT [FK_T_U] FOREIGN KEY 
    (
     [K] 
    ) REFERENCES [U] ([K]) 

    ALTER TABLE [dbo].[T] WITH NOCHECK ADD CONSTRAINT [FK_T_V] FOREIGN KEY 
    (
     [I] 
    ) REFERENCES [V] ([I]) 
END 

IF NOT EXISTS (SELECT * FROM sys.tables t INNER JOIN sys.columns c ON t.object_id=c.object_id WHERE t.name='T' and c.name='X') 
BEGIN 
    ALTER TABLE [T] ADD [X] BIT; 
END 

IF NOT EXISTS (SELECT * FROM sys.tables t INNER JOIN sys.columns c ON t.object_id=c.object_id WHERE t.name='T' and c.name='y') 
BEGIN 
    ALTER TABLE [T] ADD [Y] BIT; 
END 

IF NOT EXISTS (SELECT * FROM sys.tables t INNER JOIN sys.columns c ON t.object_id=c.object_id WHERE t.name='T' and c.name='Z') 
BEGIN 
    ALTER TABLE [T] ADD [Z] BIT; 
END 

COMMIT TRANSACTION 
+0

あなたのアイデアをありがとう! – ShieldOfSalvation

0

が...私は、オブジェクトIDのチェックの大ファンだ

IF (SELECT OBJECT_ID('DATABASENAME..TABLENAME')) IS NOT NULL 
BEGIN 
<DO THINGS HERE> 
END 
関連する問題