代码之家  ›  专栏  ›  技术社区  ›  onedaywhen

如何发现触发器的父模式?

  •  2
  • onedaywhen  · 技术社区  · 16 年前

    为了发现任何给定MS SQL Server数据库中的所有触发器,我目前正在查询sysobjects表(这很好,因为它在MS SQL Server 2000中工作,我必须支持它),例如。

    SELECT R1.name AS trigger_name, 
           T1.name AS trigger_parent_table_name
      FROM sysobjects AS R1 
           INNER join sysobjects AS T1 
              ON R1.parent_obj = T1.id 
     WHERE R1.xtype = 'tr';
    

    这给了我一个触发器名称的简化列表,并且我可以使用每个触发器名称

    EXEC sp_helptext 'trigger_name_here' 
    

    找到定义。对于只使用默认dbo模式的数据库来说,这很好。

    我现在有一个MS SQL Server 2005数据库,它使用多个模式。发现每个触发器的模式的最佳方法是什么?

    1 回复  |  直到 16 年前
        1
  •  6
  •   j.a.estevan    16 年前

    您正在寻找触发器的父对象,因此它将始终是一个表。在sys.tables(系统视图)中,您可以获取schema_id,并使用它可以转到sys.schemas(系统视图)以获取架构的名称。

    --

    编辑:

    守则:

    SELECT     sys.objects.name AS [trigger], 
               sys.tables.name AS [table], 
               sys.objects.type, 
               sys.schemas.name AS [schema]
    FROM       sys.schemas RIGHT OUTER JOIN
               sys.tables ON sys.schemas.schema_id = sys.tables.schema_id RIGHT OUTER JOIN
               sys.objects ON sys.tables.object_id = sys.objects.parent_object_id
    WHERE      sys.objects.type = 'tr'
    

    SELECT     O.name, O.type, S.name AS [schema], 
               OP.name AS parent_name, OP.type AS parent_type, SP.name AS parent_schema  
    FROM       sys.schemas AS SP RIGHT OUTER JOIN
               sys.objects AS OP ON SP.schema_id = OP.schema_id RIGHT OUTER JOIN
               sys.objects AS O LEFT OUTER JOIN
               sys.schemas AS S ON O.schema_id = S.schema_id ON OP.object_id = O.parent_object_id