-
05-09-2019 - |
質問
私は、MS SQL 2008を使用して、私は、動的に作成されたデータベースでトリガーを作成したい。
データベースを作成すると、他のデータベースのストアドプロシージャ内で呼び出され、完全に動作しますが、私は、トリガやストアドプロシージャを追加する場合、実行は失敗します。
私はとdynamiyのSQLを実行しようとすると、
EXEC('USE dbase
GO
CREATE TRIGGER [blah]
GO')
私が入手ます:
'GO' 付近に間違った構文
そして、私は削除する場合「を使用し...」トリガが間違ったデータベースに作成されます。
私の問題を回避するためのコツはありますか?
Thxを
解決
"GO" T-SQL言語ではありません。それは(それが「サーバーにテキストを送信する」という意味)バッチ区切りとしてSSMSのようなクライアントツールによって解釈キーワードです。
さて、CREATE TRIGGERを「使用dbnameは」使用することはできませんので、バッチの最初のステートメントでなければなりません。
あなたがEXECの前に「使用dbnname」を言及している場合、それメイアップ接続のデフォルトデータベースインチあなたは、テストする必要があると思います(私はできない今、申し訳ありません)。
--Might work
USE dbase
EXEC ('CREATE TRIGGER [blah]
')
それとも、接続して、コードを実行するために、SQLCMDまたはOSQLを使用する必要があります:これは、接続上のデシベルコンテキストを設定することができます。していないが、T-SQL内でます。
それとも、ALTER LOGINが
EXEC前DEFAULT_DATABASE = dbnameのようにして試すことができますxxxALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname
--Now the EXEC will connect to default db if above approach fails
EXEC('CREATE TRIGGER [blah]
')
他のヒント
あなたは、execを呼び出す前に、データベースを切り替え、右後に戻って切り替えることができます:
use newdb
exec ('CREATE TRIGGER [blah] ...')
use originaldb
またはRPCのenalbedと、右のデータベースへのリンクサーバーを作成し、かつます:
EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName
それとも、トリガーとを作成したい場所を、データベース内のデフォルトのカタログを持つ別のユーザーを作成します:
EXECUTE AS LOGIN = 'UserName'
EXEC ('CREATE TRIGGER [blah] ...')
REVERT
は、存在を検証基準を作成し、ALTERで変更する。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MiTrigger]') AND type in (N'TR'))
EXEC ('CREATE TRIGGER [MiTrigger] ON [dbo].[MiTabla] FOR DELETE AS SET NOCOUNT ON')
GO