2010-11-29 11 views
183

Necesito enumerar todos los desencadenantes en la base de datos de SQL Server con el nombre de la tabla y el esquema de la tabla.Necesito enumerar todos los desencadenantes en la base de datos de SQL Server con el nombre de la tabla y el esquema de la tabla

casi llego con esto:

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

que sólo tiene que conseguir el esquema de la tabla también.

Respuesta

331

Aquí hay una manera:

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' 

EDITAR: comentada unirse a sysusers de consulta para trabajar en 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: Para 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

No obtuve ningún resultado. –

+0

Impar Funciona para mí en las instancias 2005 y 2008. –

+1

@Ronnie - ¿Qué versión de SQL Server estás usando? Es posible que esto no funcione en versiones anteriores (2000 y anteriores) ... – JNK

31

Aquí tienes.

SELECT 
    [so].[name] AS [trigger_name], 
    USER_NAME([so].[uid]) AS [trigger_owner], 
    USER_NAME([so2].[uid]) AS [table_schema], 
    OBJECT_NAME([so].[parent_obj]) AS [table_name], 
    OBJECTPROPERTY([so].[id], 'ExecIsUpdateTrigger') AS [isupdate], 
    OBJECTPROPERTY([so].[id], 'ExecIsDeleteTrigger') AS [isdelete], 
    OBJECTPROPERTY([so].[id], 'ExecIsInsertTrigger') AS [isinsert], 
    OBJECTPROPERTY([so].[id], 'ExecIsAfterTrigger') AS [isafter], 
    OBJECTPROPERTY([so].[id], 'ExecIsInsteadOfTrigger') AS [isinsteadof], 
    OBJECTPROPERTY([so].[id], 'ExecIsTriggerDisabled') AS [disabled] 
FROM sysobjects AS [so] 
INNER JOIN sysobjects AS so2 ON so.parent_obj = so2.Id 
WHERE [so].[type] = 'TR' 

Un par de cosas aquí ...

También veo que estabas tratando de tirar de la información de las tablas padre esquema, creo que con el fin de hacer por lo que también tendría que unirse a la tabla sysobjects en sí mismo para que pueda obtener correctamente la información de esquema para la tabla padre. la consulta anterior hace esto. Además, la tabla sysusers no era necesaria en los resultados, por lo que se eliminó Join.

probado con SQL 2000, SQL Server 2005 y SQL 2008 R2

+0

No. Esto funciona donde propietario/esquema también en SQL Server 2000. Esto no devuelve el esquema correcto cuando se ejecuta en una base de datos 2005/8. –

+0

Está perfectamente bien hacer 'SELECT Alias ​​= Expression'. No ha sido desaprobado. Lo que ha quedado obsoleto es 'SELECT 'Alias' = Expression'. ¡Obtuve esta información de tu propio enlace! Por favor, corrija la información errónea. – ErikE

8
SELECT 
    ServerName = @@servername, 
    DatabaseName = db_name(), 
    SchemaName = isnull(s.name, ''), 
    TableName = isnull(o.name, 'DDL Trigger'), 
    TriggerName = t.name, 
    Defininion = object_definition(t.object_id) 

FROM sys.triggers t 
    LEFT JOIN sys.all_objects o 
     ON t.parent_id = o.object_id 
    LEFT JOIN sys.schemas s 
     ON s.schema_id = o.schema_id 
ORDER BY 
    SchemaName, 
    TableName, 
    TriggerName 
17

tuve la misma tarea recientemente y se usa lo siguiente para SQL Server 2012 db. Utilice el estudio de gestión y conéctese a la base de datos que desea buscar. Luego ejecuta la siguiente secuencia de comandos.

Select 
[tgr].[name] as [trigger name], 
[tbl].[name] as [table name] 

from sysobjects tgr 

join sysobjects tbl 
on tgr.parent_obj = tbl.id 

WHERE tgr.xtype = 'TR' 
+0

Resultó en vacío. No debería ser. El mío es Microsoft SQL Server 2017. –

11

También puede obtener el cuerpo de los factores desencadenantes de la siguiente manera:

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' 
2

utilizar esta consulta:

SELECT  
     DB_NAME() AS DataBaseName, 
     S.Name AS SchemaName,    
     T.name AS TableName, 
     dbo.SysObjects.Name AS TriggerName, 
     dbo.sysComments.Text AS SqlContent, 
    FROM dbo.SysObjects 
    INNER JOIN dbo.sysComments ON dbo.SysObjects.ID = dbo.sysComments.ID 
    INNER JOIN sys.tables AS T ON sysobjects.parent_obj = t.object_id 
    INNER JOIN sys.schemas AS S ON t.schema_id = s.schema_id 
    WHERE dbo.SysObjects.xType = 'TR' 
     AND dbo.SysObjects.Name LIKE 'Permit_AfterInsert' ---- <----- HERE 
2

esto puede ayudar.

SELECT DISTINCT o.[name] AS [Table] 
FROM [sysobjects] o 
JOIN [sysobjects] tr 
    ON o.[id] = tr.[parent_obj] 
WHERE tr.[type] = 'tr' 
ORDER BY [Table] 

Get a list of tables and all their triggers. 

SELECT DISTINCT o.[name] AS [Table], tr.[name] AS [Trigger] 
FROM [sysobjects] o 
JOIN [sysobjects] tr 
    ON o.[id] = tr.[parent_obj] 
WHERE tr.[type] = 'tr' 
ORDER BY [Table], [Trigger] 
3
SELECT 
    sysobjects.name AS trigger_name ,OBJECT_NAME(parent_obj) AS table_name ,s.name AS table_schema 
    ,USER_NAME(sysobjects.uid) AS trigger_owner 


    ,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' 

este trabajo para mí

4

Utilice esta consulta:

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

Es muy sencillo y útil.

+0

La tabla [Database_Name] .sys.triggers para mi caso está vacía. El mío es con Microsoft SQL Server 2017 –

1

El justo por encima de código es incorrecto, como se muestra:

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' 
EXCEPT 
SELECT OBJECT_NAME(parent_id) as Table_Name FROM sys.triggers 
2

Esto es lo que yo uso (por lo general envuelto en algo que me meto en el Modelo):

Select 
    [Parent] = Left((Case When Tr.Parent_Class = 0 Then '(Database)' Else Object_Name(Tr.Parent_ID) End), 32), 
    [Schema] = Left(Coalesce(Object_Schema_Name(Tr.Object_ID), '(None)'), 16), 
    [Trigger name] = Left(Tr.Name, 32), 
    [Type] = Left(Tr.Type_Desc, 3), -- SQL or CLR 
    [MS?] = (Case When Tr.Is_MS_Shipped = 1 Then 'X' Else ' ' End), 
    [On?] = (Case When Tr.Is_Disabled = 0 Then 'X' Else ' ' End), 
    [Repl?] = (Case When Tr.Is_Not_For_Replication = 0 Then 'X' Else ' ' End), 
    [Event] = Left((Case When Tr.Parent_Class = 0 
         Then (Select Top 1 Left(Te.Event_Group_Type_Desc, 40) 
          From Sys.Trigger_Events As Te 
          Where Te.Object_ID = Tr.Object_ID) 
         Else ((Case When Tr.Is_Instead_Of_Trigger = 1 Then 'Instead Of ' Else 'After ' End)) + 
          SubString(Cast((Select [text()] = ', ' + Left(Te.Type_Desc, 1) + Lower(SubString(Te.Type_Desc, 2, 32)) + 
                (Case When Te.Is_First = 1 Then ' (First)' When Te.Is_Last = 1 Then ' (Last)' Else '' End) 
              From Sys.Trigger_Events As Te 
              Where Te.Object_ID = Tr.Object_ID 
              Order By Te.[Type] 
              For Xml Path ('')) As Character Varying), 3, 60) End), 60) 
    -- If you like: 
    -- , [Get text with] = 'Select Object_Definition(' + Cast(Tr.Object_ID As Character Varying) + ')' 
From 
    Sys.Triggers As Tr 
Order By 
    Tr.Parent_Class, -- database triggers first 
    Parent -- alphabetically by parent 

Como se puede ver que es un skosh McGyver más, pero creo que vale la pena:

Parent       Schema   Trigger name      Type MS? On? Repl? Event 
-------------------------------- ---------------- -------------------------------- ---- ---- ---- ----- ----------------------------------------- 
(Database)      (None)   ddlDatabaseTriggerLog   SQL   X  DDL_DATABASE_LEVEL_EVENTS 
Employee       HumanResources dEmployee      SQL  X   Instead Of Delete 
Person       Person   iuPerson       SQL  X   After Insert, Update 
PurchaseOrderDetail    Purchasing  iPurchaseOrderDetail    SQL  X X  After Insert 
PurchaseOrderDetail    Purchasing  uPurchaseOrderDetail    SQL  X X  After Update 
PurchaseOrderHeader    Purchasing  uPurchaseOrderHeader    SQL  X X  After Update 
SalesOrderDetail     Sales   iduSalesOrderDetail    SQL  X X  After Insert, Update, Delete 
SalesOrderHeader     Sales   uSalesOrderHeader    SQL  X   After Update (First) 
Vendor       Purchasing  dVendor       SQL  X   Instead Of Delete 
WorkOrder      Production  iWorkOrder      SQL  X X  After Insert 
WorkOrder      Production  uWorkOrder      SQL  X X  After Update 

(Desplácese a la derecha para ver la columna final y más útil)

1
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

Si está buscando ALL desencadenantes, recuerde MS-SQL tiene dos gatillos basados ​​en SQL (sysobjects.type = 'TR') y disparadores basados ​​en CLR (sysobjects.type = 'TA').

5

Y ¿qué piensa acerca de esto: Muy corto y aseado :)

SELECT OBJECT_NAME(parent_id) Table_or_ViewNM, 
     name TriggerNM, 
     is_instead_of_trigger, 
     is_disabled 
FROM sys.triggers 
WHERE parent_class_desc = 'OBJECT_OR_COLUMN' 
ORDER BY OBJECT_NAME(parent_id), 
Name ; 
0

Una de las dificultades es que el texto o textos tiene saltos de línea. Mi torpe Kludge, para obtener algo más tabular, es agregar un literal HTML a la cláusula SELECT, copiar y pegar todo en el bloc de notas, guardar con una extensión html, abrir en un navegador, luego copiar y pegar en una hoja de cálculo. ejemplo

SELECT obj.NAME AS TBL,trg.name,sm.definition,'<br>' 
FROM SYS.OBJECTS obj 
LEFT JOIN (SELECT trg1.object_id,trg1.parent_object_id,trg1.name FROM sys.objects trg1 WHERE trg1.type='tr' AND trg1.name like 'update%') trg 
ON obj.object_id=trg.parent_object_id 
LEFT JOIN (SELECT sm1.object_id,sm1.definition FROM sys.sql_modules sm1 where sm1.definition like '%suser_sname()%') sm ON trg.object_id=sm.object_id 
WHERE obj.type='u' 
ORDER BY obj.name; 

es posible que todavía tiene que perder el tiempo con pestañas para que la descripción en un campo, pero al menos estará en una línea, que me parece muy útil.

Cuestiones relacionadas