web-dev-qa-db-ja.com

データベーストリガーの定義を取得するにはどうすればよいですか?

データベースの1つで次のスクリプトを実行すると、

SELECT * FROM SYS.triggers

enter image description here

sys.triggers について調べようとすると

トリガーである各オブジェクトの行を含み、タイプはTRまたはTAです。 DMLトリガー名はスキーマスコープであるため、sys.objectsに表示されます。 DDLトリガー名は親エンティティによってスコープされ、このビューでのみ表示されます。

次に、データベーストリガーの定義を取得するにはどうすればよいですか?

2

OBJECT_DEFINITION() を使用できます。

ドキュメントからの恥知らずなコピーと貼り付けの例:

次の例では、Personスキーマのユーザー定義トリガーuAddressの定義を返します。組み込み関数OBJECT_IDは、トリガーのオブジェクトIDをOBJECT_DEFINITIONステートメントに返すために使用されます。

USE AdventureWorks2012;  
GO  
SELECT OBJECT_DEFINITION (OBJECT_ID(N'Person.uAddress')) AS [Trigger Definition];   
GO 
2
LowlyDBA

いかがですか

select m.definition from sys.triggers t
inner join sys.objects o on t.object_id = o.object_id
inner join sys.sql_modules m on m.object_id = o.object_id
3
Randi Vertongen

object_definition を試しましたが、うまくいくようです。

SELECT 
             object_id=s.object_id
            ,parent_name  = CASE WHEN s.parent_id = 0 THEN 'DATABASE' ELSE QUOTENAME(OBJECT_SCHEMA_NAME(s.parent_id)) + '.' + QUOTENAME(OBJECT_NAME(s.parent_id)) END

            ,trigger_name = CASE WHEN s.parent_class = 1 
                                 THEN QUOTENAME(OBJECT_SCHEMA_NAME(s.object_id)) + '.' + QUOTENAME(OBJECT_NAME(s.object_id))
                                 ELSE S.name
                             END

            ,s.is_disabled
            ,THE_DEFINITION = object_definition(s.object_id)
            FROM sys.triggers s

enter image description here

データベーストリガー定義の1つの貼り付けをコピーする例:

create trigger tr_MStran_alterview 
on database 
for ALTER_VIEW as  

set ANSI_NULLS ON         
set ANSI_PADDING ON         
set ANSI_WARNINGS ON         
set ARITHABORT ON         
set CONCAT_NULL_YIELDS_NULL ON         
set NUMERIC_ROUNDABORT OFF         
set QUOTED_IDENTIFIER ON           
declare @EventData xml         
set @EventData=EventData()           
exec sys.sp_MStran_ddlrepl @EventData, 2
1