1

新しいテーブル定義(テーブルステートメントの作成)を取得し、ddlaltertableトリガーが起動したときにそれをtxtファイルに保存したいと思います。

xp_helptextを試しましたが、これはビューまたはストアドプロシージャでのみ機能します。新しいcreateステートメントを取得するためにテーブルを変更するためのこのようなものがあることを願っています。

また、xp_cmdshellを使用して.netを起動しようとしました。そして、INFORMATION_SCHEMAからの情報に従ってスクリプトをハードコーディングします。ただし、.netの実行中にトリガーが閉じられないため、ロックされます。

4

1 に答える 1

2

あなたはこれを行うことはできません。ALTER TABLEを実行すると、SQLServerは新しいCREATETABLEステートメントを生成しません。DDLトリガーのEVENTDATA()には、テーブル定義全体ではなく、ALTERコマンドのみが含まれていることがわかります。また、INFORMATION_SCHEMAもsys.tablesのようなカタログビューも、元のコマンドがCREATE TABLEであったとしても、CREATE TABLE世代のコピーを格納しないため、そのルートから取得するものがないことに気付くでしょう。

サーバー側のトレースを実行し、テーブルを右クリックして[スクリプト]>[作成先]>[新しいクエリエディターウィンドウ]を選択すると、ManagementStudioがテーブル作成スクリプトを生成するために何を行うかを確認できます。これは単純なSELECT create_table FROM sys.somethingものではなく、多数のDMVに対する一連のメタデータクエリであると確信できます。CREATE TABLEはデータベースやクエリではなくコードで実行されるため、アセンブルされていることすら表示されません。

よりアクセスしやすい:SMOには、オブジェクトをスクリプト化するためのメソッドがありますテーブルなど。しかし、トリガー内からこれを実行しようとすべきではないと思います。ALTERTABLEトランザクションに、外部プロセスの呼び出しやファイルシステムへの書き込みなどの機能を待機させるのは悪い考えです。これが私が提案するものです。テーブルの定義が変更され、DDLトリガーでキューテーブルに行が追加されます。OSには、SMOメソッドを使用してテーブル名を指定してスクリプトを生成するPowerShellスクリプトまたはC#コマンドライン実行可能ファイルがあります。そのスクリプトを1分ごとまたは5分ごとに実行するようにスケジュールし、キューテーブルで、発生したがキャプチャしていない新しい変更がないかどうかを確認します。プログラムは、SMOが生成したCREATE TABLEスクリプトに基づいてファイルを書き込み、キューテーブルを更新(または行を削除)して、1回だけ処理されるようにします。

于 2012-06-07T19:49:52.173 に答える