0

MS SQL 2008 を使用しており、動的に作成されたデータベースにトリガーを作成したいと考えています。

データベースの作成は、別のデータベースのストアド プロシージャ内で呼び出され、完全に実行されますが、トリガーまたはストアド プロシージャを追加したい場合、実行に失敗します。

動的SQLを実行しようとすると

EXEC('USE dbase
GO
CREATE TRIGGER [blah]
GO')

私は得る:

「GO」付近の間違った構文

「USE ...」を削除すると、トリガーが間違ったデータベースに作成されます。

私の問題を回避するためのトリックはありますか?

どうも

4

3 に答える 3

3

「GO」はT-SQL言語ではありません。これは、SSMS などのクライアント ツールによってバッチ セパレータとして解釈されるキーワードです (つまり、「テキストをサーバーに送信する」ことを意味します)。

現在、CREATE TRIGGER はバッチ内の最初のステートメントでなければならないため、「USE dbname」は使用できません。

EXEC の前に「USE dbnname」を指定すると、接続用のデフォルト データベースに登録される可能性があります。テストする必要があります(今はできません、申し訳ありません)

--Might work
USE dbase
EXEC ('CREATE TRIGGER [blah]
')

または、sqlcmd または osql を使用して接続し、コードを実行する必要があります。これにより、接続時に db コンテキストを設定できます。ただし、T-SQL 内ではありません。

または、EXEC の前に ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname を試すことができます

ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname 
--Now the EXEC will connect to default db if above approach fails
EXEC('CREATE TRIGGER [blah]
')
于 2009-05-25T13:04:38.203 に答える
0

exec を呼び出す前にデータベースを切り替え、直後に元に戻すことができます。

use newdb
exec ('CREATE TRIGGER [blah] ...')
use originaldb

または、適切なデータベースへのリンク サーバーを作成し、RPC を有効にして、次の操作を行います。

EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName

または、トリガーを作成するデータベースにデフォルト カタログを持つ別のユーザーを作成し、次の操作を行います。

EXECUTE AS LOGIN = 'UserName'
EXEC ('CREATE TRIGGER [blah] ...')
REVERT
于 2009-05-25T13:20:54.643 に答える