質問

私は、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のようにして試すことができますxxx
ALTER 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top