Need to list all triggers in SQL Server database with table name and table's schema

后端 未结 19 752
再見小時候
再見小時候 2020-11-28 17:12

I need to list all triggers in SQL Server database with table name and table\'s schema.

I\'m almost there with this:

SELECT trigger_name = name, trig         


        
相关标签:
19条回答
  • 2020-11-28 17:53

    Use this query :

    SELECT OBJECT_NAME(parent_id) as Table_Name, * FROM [Database_Name].sys.triggers
    

    It's simple and useful.

    0 讨论(0)
  • 2020-11-28 17:54

    Necromancing.
    Just posting because all solutions so far fall a bit short of completeness.

    SELECT 
         sch.name AS trigger_table_schema 
        ,systbl.name AS trigger_table_name 
        ,systrg.name AS trigger_name 
        ,sysm.definition AS trigger_definition 
        ,systrg.is_instead_of_trigger
    
    
    
        -- https://stackoverflow.com/questions/5340638/difference-between-a-for-and-after-triggers
        -- Difference between a FOR and AFTER triggers?
        -- CREATE TRIGGER trgTable on dbo.Table FOR INSERT,UPDATE,DELETE
        -- Is the same as
        -- CREATE TRIGGER trgTable on dbo.Table AFTER INSERT,UPDATE,DELETE
        -- An INSTEAD OF trigger is different, and fires before and instead of the insert 
        -- and can be used on views, in order to insert the appropriate values into the underlying tables.
        -- AFTER specifies that the DML trigger is fired only when all operations 
        -- specified in the triggering SQL statement have executed successfully. 
        -- All referential cascade actions and constraint checks also must succeed before this trigger fires. 
        -- AFTER is the default when FOR is the only keyword specified.
        ,CASE WHEN systrg.is_instead_of_trigger = 1 THEN 0 ELSE 1 END AS is_after_trigger 
    
        ,systrg.is_not_for_replication 
        ,systrg.is_disabled
        ,systrg.create_date 
        ,systrg.modify_date
    
        ,CASE WHEN systrg.parent_class = 1 THEN 'TABLE' WHEN systrg.parent_class = 0 THEN 'DATABASE' END trigger_class 
    
    
        ,CASE 
            WHEN systrg.[type] = 'TA' then 'Assembly (CLR) trigger'
            WHEN systrg.[type] = 'TR' then 'SQL trigger' 
            ELSE '' 
        END AS trigger_type 
    
        -- https://dataedo.com/kb/query/sql-server/list-triggers 
        -- ,(CASE WHEN objectproperty(systrg.object_id, 'ExecIsUpdateTrigger') = 1
        --      THEN 'UPDATE ' ELSE '' END 
        -- + CASE WHEN objectproperty(systrg.object_id, 'ExecIsDeleteTrigger') = 1
        --      THEN 'DELETE ' ELSE '' END
        -- + CASE WHEN objectproperty(systrg.object_id, 'ExecIsInsertTrigger') = 1
        --      THEN 'INSERT' ELSE '' END
        -- ) AS trigger_event 
    
        ,
        ( 
            STUFF 
            ( 
                ( 
                    SELECT 
                        ', ' + type_desc AS [text()]
                        -- STRING_AGG(type_desc, ', ') AS foo 
                    FROM sys.events AS syse 
                    WHERE syse.object_id = systrg.object_id
                    FOR XML PATH(''), TYPE 
                    -- GROUP BY syse.object_id 
                ).value('.[1]', 'nvarchar(MAX)') 
                , 1, 2, '' 
            ) 
        ) AS trigger_event_groups 
    
        -- ,CASE WHEN systrg.parent_class = 1 THEN 'TABLE' WHEN systrg.parent_class = 0 THEN 'DATABASE' END trigger_class  
    
        ,'DROP TRIGGER "' + sch.name + '"."' + systrg.name + '"; ' AS sql 
        -- ,systrg.*
    FROM sys.triggers AS systrg 
    
    LEFT JOIN sys.sql_modules AS sysm 
        ON sysm.object_id = systrg.object_id 
    
    -- sys.objects for view triggers 
    -- LEFT JOIN sys.objects AS systbl ON systbl.object_id = systrg.object_id 
    
    -- inner join if you only want table-triggers 
    LEFT JOIN sys.tables AS systbl ON systbl.object_id = systrg.parent_id 
    
    LEFT JOIN sys.schemas AS sch 
        ON sch.schema_id = systbl.schema_id 
    
    WHERE (1=1) 
    
    -- AND sch.name IS NOT NULL 
    -- AND sch.name IS NULL 
    -- AND sch.name = 'dbo' 
    -- And here, exclude some triggers with a certain naming schema 
    /*  
    AND 
    (
        -- systbl.name IS NULL 
        -- OR 
        NOT 
        (
            systrg.name = 'TRG_' + systbl.name  + '_INSERT_History'
            OR 
            systrg.name = 'TRG_' + systbl.name  + '_UPDATE_History'
            OR 
            systrg.name = 'TRG_' + systbl.name  + '_DELETE_History'
        )
    )
    */
    
    ORDER BY 
         sch.name 
        ,systbl.name 
        ,systrg.name 
    
    0 讨论(0)
  • 2020-11-28 17:54
        CREATE TABLE [dbo].[VERSIONS](
            [ID] [uniqueidentifier] NOT NULL,
            [DATE] [varchar](100) NULL,
            [SERVER] [varchar](100) NULL,
            [DATABASE] [varchar](100) NULL,
            [USER] [varchar](100) NULL,
            [OBJECT] [varchar](100) NULL,
            [ACTION] [varchar](100) NULL,
            [CODE] [varchar](max) NULL,
         CONSTRAINT [PK_VERSIONS] PRIMARY KEY CLUSTERED 
        (
            [ID] ASC
        )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
        ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
        GO
    
        ALTER TABLE [dbo].[VERSIONS] ADD  CONSTRAINT [DF_VERSIONS_ID]  DEFAULT (newid()) FOR [ID]
        GO
    
    
        DROP TRIGGER [DB_VERSIONS_TRIGGER] ON ALL SERVER
    
        CREATE TRIGGER [DB_VERSIONS_TRIGGER] ON ALL SERVER FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, 
        CREATE_TRIGGER, ALTER_TRIGGER, DROP_TRIGGER, CREATE_FUNCTION, ALTER_FUNCTION, DROP_FUNCTION, CREATE_VIEW, ALTER_VIEW, 
        DROP_VIEW, CREATE_TABLE, ALTER_TABLE, DROP_TABLE 
        AS 
        SET NOCOUNT ON SET XACT_ABORT OFF; 
        BEGIN 
            TRY 
                DECLARE @DATA XML = EVENTDATA() 
                DECLARE @SERVER VARCHAR(100) = @DATA.value('(EVENT_INSTANCE/ServerName)[1]','VARCHAR(100)') 
                DECLARE @DATABASE VARCHAR(100) = @DATA.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'VARCHAR(100)') 
                DECLARE @USER VARCHAR(100) = @DATA.value('(/EVENT_INSTANCE/LoginName)[1]','VARCHAR(100)') 
                DECLARE @OBJECT VARCHAR(100) = @DATA.value('(EVENT_INSTANCE/ObjectName)[1]','VARCHAR(100)') 
                DECLARE @ACTION VARCHAR(100) = @DATA.value('(/EVENT_INSTANCE/EventType)[1]','VARCHAR(100)') 
                DECLARE @CODE VARCHAR(MAX) = @DATA.value('(/EVENT_INSTANCE//TSQLCommand)[1]','VARCHAR(MAX)' ) 
    
                IF OBJECT_ID('DB_VERSIONS.dbo.VERSIONS') IS NOT NULL 
                BEGIN 
                    INSERT INTO [DB_VERSIONS].[dbo].[VERSIONS]([SERVER], [DATABASE], [USER], [OBJECT], [ACTION], [DATE], [CODE]) VALUES (@SERVER, @DATABASE, @USER, @OBJECT, @ACTION, getdate(), ISNULL(@CODE, 'NA')) 
                END 
            END 
            TRY 
            BEGIN 
                CATCH 
            END 
        CATCH 
        RETURN
    
    0 讨论(0)
  • 2020-11-28 17:55
    SELECT tbl.name as Table_Name,trig.name as Trigger_Name,trig.is_disabled  
    FROM [sys].[triggers] as trig inner join sys.tables as tbl on 
    trig.parent_id = tbl.object_id 
    
    0 讨论(0)
  • 2020-11-28 17:56

    You can also get the body of triggers as following:

    SELECT      o.[name],
                c.[text]
    FROM        sys.objects AS o
    INNER JOIN  sys.syscomments AS c
    ON      o.object_id = c.id
    WHERE   o.[type] = 'TR'
    
    0 讨论(0)
  • 2020-11-28 17:58

    Here's one way:

    SELECT 
         sysobjects.name AS trigger_name 
        ,USER_NAME(sysobjects.uid) AS trigger_owner 
        ,s.name AS table_schema 
        ,OBJECT_NAME(parent_obj) AS table_name 
        ,OBJECTPROPERTY( id, 'ExecIsUpdateTrigger') AS isupdate 
        ,OBJECTPROPERTY( id, 'ExecIsDeleteTrigger') AS isdelete 
        ,OBJECTPROPERTY( id, 'ExecIsInsertTrigger') AS isinsert 
        ,OBJECTPROPERTY( id, 'ExecIsAfterTrigger') AS isafter 
        ,OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger') AS isinsteadof 
        ,OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') AS [disabled] 
    FROM sysobjects 
    
    INNER JOIN sysusers 
        ON sysobjects.uid = sysusers.uid 
    
    INNER JOIN sys.tables t 
        ON sysobjects.parent_obj = t.object_id 
    
    INNER JOIN sys.schemas s 
        ON t.schema_id = s.schema_id 
    
    WHERE sysobjects.type = 'TR' 
    

    EDIT: Commented out join to sysusers for query to work on AdventureWorks2008.

    SELECT 
         sysobjects.name AS trigger_name 
        ,USER_NAME(sysobjects.uid) AS trigger_owner 
        ,s.name AS table_schema 
        ,OBJECT_NAME(parent_obj) AS table_name 
        ,OBJECTPROPERTY( id, 'ExecIsUpdateTrigger') AS isupdate 
        ,OBJECTPROPERTY( id, 'ExecIsDeleteTrigger') AS isdelete 
        ,OBJECTPROPERTY( id, 'ExecIsInsertTrigger') AS isinsert 
        ,OBJECTPROPERTY( id, 'ExecIsAfterTrigger') AS isafter 
        ,OBJECTPROPERTY( id, 'ExecIsInsteadOfTrigger') AS isinsteadof 
        ,OBJECTPROPERTY(id, 'ExecIsTriggerDisabled') AS [disabled] 
    FROM sysobjects 
    /*
    INNER JOIN sysusers 
        ON sysobjects.uid = sysusers.uid 
    */  
    INNER JOIN sys.tables t 
        ON sysobjects.parent_obj = t.object_id 
    
    INNER JOIN sys.schemas s 
        ON t.schema_id = s.schema_id 
    WHERE sysobjects.type = 'TR' 
    

    EDIT 2: For SQL 2000

    SELECT 
         o.name AS trigger_name 
        ,'x' AS trigger_owner 
        /*USER_NAME(o.uid)*/ 
        ,s.name AS table_schema 
        ,OBJECT_NAME(o.parent_obj) AS table_name 
        ,OBJECTPROPERTY(o.id, 'ExecIsUpdateTrigger') AS isupdate 
        ,OBJECTPROPERTY(o.id, 'ExecIsDeleteTrigger') AS isdelete 
        ,OBJECTPROPERTY(o.id, 'ExecIsInsertTrigger') AS isinsert 
        ,OBJECTPROPERTY(o.id, 'ExecIsAfterTrigger') AS isafter 
        ,OBJECTPROPERTY(o.id, 'ExecIsInsteadOfTrigger') AS isinsteadof 
        ,OBJECTPROPERTY(o.id, 'ExecIsTriggerDisabled') AS [disabled] 
    FROM sysobjects AS o 
    /*
    INNER JOIN sysusers 
        ON sysobjects.uid = sysusers.uid 
    */  
    INNER JOIN sysobjects AS o2 
        ON o.parent_obj = o2.id 
    
    INNER JOIN sysusers AS s 
        ON o2.uid = s.uid 
    
    WHERE o.type = 'TR'
    
    0 讨论(0)
提交回复
热议问题