【问题标题】:How to find all trigger associated with a table with SQL Server?如何使用 SQL Server 查找与表关联的所有触发器?
【发布时间】:2012-09-10 07:17:38
【问题描述】:

我在 SQL Server 中为表创建了一个触发器,它对我有用。

我的问题是:如何找到并修改它?

我使用此查询来查找我的触发器:

select * from sys.triggers

这会找到所有触发器,但是如何打开它并更改触发器?

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    您只需使用 SSMS 即可做到这一点。只需转到您的表名并展开触发器节点即可查看与该表关联的触发器列表。右键单击以修改触发器。

    【讨论】:

      【解决方案2】:
      select so.name, text
      from sysobjects so, syscomments sc
      where type = 'TR'
      and so.id = sc.id
      and text like '%YourTableName%'
      

      这样您可以列出与给定表关联的所有触发器。

      【讨论】:

      • 这可能会返回 too many rows 如果 %YoutTableName% 不仅仅代表一个表。示例:产品 -产品促销>- 促销
      • 这是一个很好的答案,因为它应该适用于所有开发环境。我需要找到一个未显示在 SSMS 中我的数据库触发器文件夹下的触发器,该触发器连接到 Azure 托管数据库。
      【解决方案3】:

      这可能有用

      SELECT 
       t.name AS TableName,
       tr.name AS TriggerName  
      FROM sys.triggers tr
      INNER JOIN sys.tables t ON t.object_id = tr.parent_id
      WHERE 
      t.name in ('TABLE_NAME(S)_GOES_HERE');
      

      这样你只需插入表的名称,查询就会获取你需要的所有触发器

      【讨论】:

        【解决方案4】:
        select m.definition from sys.all_sql_modules m inner join  sys.triggers t
        on m.object_id = t.object_id 
        

        这里只是复制定义并更改触发器。

        否则,您只需转到 SSMS 并展开您的数据库,然后在可编程性下展开数据库触发器,然后右键单击特定触发器并单击修改,您也可以更改。

        【讨论】:

          【解决方案5】:

          使用 sp_helptrigger 查找关联表的触发器列表

          【讨论】:

            【解决方案6】:

            在表上查找触发器:

            select so.name, text
            from sysobjects so, syscomments sc
            where type = 'TR'
            and so.id = sc.id
            and text like '%TableName%'
            

            你可以找到有表引用的存储过程:

            SELECT Name
            FROM sys.procedures
            WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%yourtablename%'
            

            【讨论】:

              【解决方案7】:

              通过

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

              此 URL 包含一组查询,您可以通过这些查询获取与特定表关联的触发器列表。

              我相信您正在使用 sqlserver 以下是获取修改触发器的步骤

              修改触发器

              1. 展开一个服务器组,然后展开一个服务器。

              2. Expand Databases,展开包含表的数据库 触发器所属,然后点击表格。

              3. 在详细信息窗格中,右键单击触发器所在的表 存在,指向所有任务,然后单击管理触发器。

              4. 在名称中,选择触发器的名称。

              5. 根据需要在文本字段中更改触发器的文本。按 CTRL+TAB 缩进 SQL Server 企业管理器的文本 触发。

              6. 要检查触发器的语法,请单击检查语法。

              【讨论】:

                【解决方案8】:

                通过此查询,您可以在所有表​​和所有视图中找到所有触发器。

                    ;WITH
                        TableTrigger
                        AS
                        (
                            Select 
                                Object_Kind = 'Table',
                                Sys.Tables.Name As TableOrView_Name , 
                                Sys.Tables.Object_Id As Table_Object_Id ,
                                Sys.Triggers.Name As Trigger_Name, 
                                Sys.Triggers.Object_Id As Trigger_Object_Id 
                            From Sys.Tables 
                            INNER Join Sys.Triggers On ( Sys.Triggers.Parent_id = Sys.Tables.Object_Id )
                            Where ( Sys.Tables.Is_MS_Shipped = 0 )
                        ),
                        ViewTrigger
                        AS
                        (
                            Select 
                                Object_Kind = 'View',
                                Sys.Views.Name As TableOrView_Name , 
                                Sys.Views.Object_Id As TableOrView_Object_Id ,
                                Sys.Triggers.Name As Trigger_Name, 
                                Sys.Triggers.Object_Id As Trigger_Object_Id 
                            From Sys.Views 
                            INNER Join Sys.Triggers On ( Sys.Triggers.Parent_id = Sys.Views.Object_Id )
                            Where ( Sys.Views.Is_MS_Shipped = 0 )
                        ),
                        AllObject
                        AS
                        (
                            SELECT * FROM TableTrigger
                
                            Union ALL
                
                            SELECT * FROM ViewTrigger
                        )
                
                
                    Select 
                        * 
                    From AllObject
                    Order By Object_Kind, Table_Object_Id 
                

                【讨论】:

                  【解决方案9】:

                  您可以通过以下查询查看与您的数据库相关的所有触发器

                  select * from sys.triggers
                  

                  对于打开的触发器,您可以使用以下语法

                  sp_helptext 'dbo.trg_InsertIntoUserTable'
                  

                  【讨论】:

                    【解决方案10】:
                     select o1.name as trigger_name,o2.name as table_name from sys.objects o1 
                     join sys.objects o2 on 
                     o1.parent_object_id=o2.object_id     
                     where o1.type='TR' 
                     and o2.name='my_table'
                     
                      
                    

                    【讨论】:

                      【解决方案11】:
                      select   B.name 
                      from     sys.objects    A
                      join     sys.triggers   B
                      on     A.object_id    =    B.parent_id
                      where    A.name    ='Table_name' /*Table Name*/
                      

                      【讨论】:

                      • 虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您提出代码建议的原因。
                      【解决方案12】:

                      下面有很多简单的查询

                      select (select [name] from  sys.tables where [object_id] = tr.parent_id ) as TableName ,*  from sys.triggers tr
                      

                      【讨论】:

                        【解决方案13】:

                        从 information_schema.TRIGGERS 中选择 *;

                        【讨论】:

                          【解决方案14】:
                          select t.name as TriggerName,m.definition,is_disabled 
                          from sys.all_sql_modules m 
                          inner join  
                          sys.triggers t
                          on m.object_id = t.object_id 
                          inner join sys.objects o
                          on o.object_id = t.parent_id
                          Where o.name = 'YourTableName'
                          

                          这将为您提供指定表

                          上的所有触发器

                          【讨论】:

                            【解决方案15】:

                            尝试使用:

                            select * from sys.objects where type='tr' and name like '%_Insert%'
                            

                            【讨论】:

                              【解决方案16】:

                              你可以打开你的触发器 sp_helptext yourtriggername

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 1970-01-01
                                • 2011-10-25
                                • 2017-07-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                相关资源
                                最近更新 更多