2

CREATE TRIGGERDB の移行時に処理される一連のステートメントを文字列として送信しようとしています。

CREATE TRIGGER [dbo].[triggerBar] ON [dbo].[tableBar]
INSTEAD OF UPDATE,INSERT AS
BEGIN
SET NOCOUNT ON
 -- Trigger body here..
END;

CREATE TRIGGER [dbo].[triggerFoo] ON [dbo].[tableFoo]
INSTEAD OF UPDATE,INSERT AS
BEGIN
SET NOCOUNT ON
  -- Trigger body here..
END;

だから私は各ステートメントブロックを区切ります;が、それでもこのエラーが発生します:

キーワード「TRIGGER」付近の構文が正しくありません

最初のトリガーだけを送信すると、問題なく動作します。何が悪いのかわからない。

4

3 に答える 3

3

バッチに関するドキュメントによると、複数のCREATE TRIGGERステートメントを同じバッチに入れることはできません。

CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER、および CREATE VIEW ステートメントは、バッチ内の他のステートメントと組み合わせることはできません。CREATE ステートメントでバッチを開始する必要があります。そのバッチに続く他のすべてのステートメントは、最初の CREATE ステートメントの定義の一部として解釈されます。

GOサーバーに送信されない SSMS、sqlcmd、および SQL Server 開発ツールによって認識されるバッチ区切り文字であるため、機能します。ツールはこれを使用して、テキストをバッチで分割し、1 つずつサーバーに送信します。トランザクションはバッチ間で動作するため (結局のところ同じ接続です)、特定の DDL ステートメントをロールバックすることができます。

Node.js からデータベース作成スクリプトを作成して実行するとします。

1 つの解決策は、SQL Server ツールと同じアプローチです。個別のバッチを生成し、データベースに対して 1 つずつ実行します。

もう 1 つのオプションは、区切り記号を使用して単一の SQL スクリプトを作成し、GOSQL Server のコマンド ライン ツールを使用して実行することです。これは、スクリプトを保存してバージョンを変更したり、変更を検出したりできるため、より保守性が高くなります。

3 番目のオプションは、SQL Server の開発ツールを使用してデータベースをモデル化することです。データベース プロジェクトは、バージョン管理と検証をサポートしています。ただし、主な利点は、Redgate のツールと同様に、SSDT がターゲット データベースを更新するスクリプトを生成できることです。SSDT は適度にスマートで、ツール自体の内部で実行される名前変更などを認識し、たとえばsp_rename1 つの列を削除して新しい列を作成する代わりに使用できます。

さらなる利点は、SSDT がdacpac、ターゲット データベースとの比較と更新スクリプトの生成に使用できるコンパイル済みモデルを生成することです。

これにより、継続的なデータベースの展開が非常に簡単になります。AppVeyorTFSでサポートされています。TeamCityおよびsqlpackageツールを実行できるツール/サービス。

欠点は、SSDT が SQL Server データベースに対してのみ機能することです。

于 2016-11-30T12:24:55.570 に答える
0

特定のステートメントは、その前に何も置くことができません。その場合、SSMS 内で、 を使用GOしてバッチの終了を示します (これにより実質的にバッファーがクリアされるため、 の前に宣言された変数は消去GOされます)。

SSMS を使用している場合は、次のことができます。

CREATE TRIGGER ... AS ...
GO
CREATE TRIGGER ... etc

SSMS の外部にいる場合は、別のコマンドを送信するか、それらを T-SQL の文字列に入れてその文字列を実行する必要があります。

DECLARE @Trig1 NVARCHAR(MAX)
DECLARE @Trig2 NVARCHAR(MAX)
DECLARE @Trig3 NVARCHAR(MAX)
SET @Trig1 = 'CREATE TRIGGER ...'
SET @Trig2 = 'CREATE TRIGGER ...'
SET @Trig3 = 'CREATE TRIGGER ...'
EXEC (@Trig1)
EXEC (@Trig2)
EXEC (@Trig3)
于 2016-11-30T11:39:45.020 に答える