SQL Server でトリガーの定義 (本体) を取得するにはどうすればよいですか?
-
09-06-2019 - |
質問
私のニーズを満たす SQL diff ツールが見つからないので、独自に作成しています。INFORMATION_SCHEMA テーブルと sys テーブルの間には、ほぼ完全な作業バージョンがあります。しかし、メタデータで見つからないことが 1 つあります。 意味 トリガーの実際の SQL コードです。私は何か見落としているのでしょうか?
ありがとう。
ありがとう、ピート、それは知りませんでした!
Scott さん、私は DB へのリモート接続を許可しない非常に基本的なホスティング パッケージを使用しています。RedGate の仕様からは (とにかく余裕がないので)、その回避策が提供されているかどうかはわかりません。また、API (Apex の API など) も存在しますが、見つかりませんでした。私の側でさらにプログラミングが必要になるソリューションに投資する意味はありません。:)
私の解決策は、一種の「スキーマ サービス」として機能する ASPX ページをサイトにドロップし、収集されたメタデータを XML として返すことです。任意の数のカタログ インスタンスをマスターと比較し、差分を表示する小さな AJAX アプリをセットアップしました。完璧ではありませんが、私にとっては大きな前進です。
再度、感謝します!
解決
sp_helptext は、トリガーを構成する SQL を取得するために機能します。
syscomments ビューのテキスト列には、オブジェクトの作成に使用される SQL も含まれています。
他のヒント
2005 年と 2008 年の場合は、 OBJECT_DEFINITION() 関数
SELECT
DB_NAME() AS DataBaseName,
dbo.SysObjects.Name AS TriggerName,
dbo.sysComments.Text AS SqlContent
FROM
dbo.SysObjects INNER JOIN
dbo.sysComments ON
dbo.SysObjects.ID = dbo.sysComments.ID
WHERE
(dbo.SysObjects.xType = 'TR')
AND
dbo.SysObjects.Name = '<YourTriggerName>'
SQLMenace の答えを拡張するために、データベースからすべてのトリガーとその定義を返す簡単なクエリを次に示します。
SELECT
sysobjects.name AS trigger_name,
OBJECT_NAME(parent_obj) AS table_name,
OBJECT_DEFINITION(id) AS trigger_definition
FROM sysobjects
WHERE sysobjects.type = 'TR'
このクエリは、トリガーの名前と本文を返します。
Select
[tgr].[name] as [trigger name],
[tbl].[name] as [table name] ,
OBJECT_DEFINITION(tgr.id) body
from sysobjects tgr
join sysobjects tbl
on tgr.parent_obj = tbl.id
WHERE tgr.xtype = 'TR'