2012-03-09 21 views
10

Mi aplicación se basa en un servidor sql db.¿Cómo obtener la lista de activadores activos en una base de datos?

Todos los clientes tienen la misma base de datos a excepción de las personalizaciones.

Algunas personalizaciones incluyen: nuevas tablas, tablas modificadas, vistas personalizadas, a medida desencadena ...

Cuando ejecuto la actualización de software algunas secuencias de comandos se ejecutan. Ahora deshabilito manualmente los desencadenadores y los vuelvo a activar después de que los guiones estén listos.

De todos modos, me gustaría deshabilitar automáticamente todos los desencadenadores (que están habilitados, algunos de ellos pueden estar ya deshabilitados) y luego volver a habilitarlos al final.

No reinventar el whell, ¿cómo hacer eso?

¿Cómo obtener solo los activadores activos en la base de datos actual?

Una vez que llegué esto puedo crear mediante programación y ejecutar el

DISABLE TRIGGER triggername ON TABLENAME 

ENABLE TRIGGER triggername ON TABLENAME 
+0

posible duplicado de [SQL Server: comprobar si un disparador es ¿Habilitado o deshabilitado?] (Http: // stackoverflow.com/questions/8136937/sql-server-check-if-a-trigger-is-enabled-or-disabled) – michaelAngelo

Respuesta

19
select objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 

1 significa verdad, 0 significa falso, obviamente,

consulta de Uso Jeff O y modificarlo un poco

o añadirlo como una cláusula where.

where TRIG.is_disabled = 0 -- or 1 depends on what you want 
+0

Elijo esto como respuesta, incluso si todo fuera correcto, esto simplemente es "perfecto". – LaBracca

+1

Nota: "Disparadores de base de datos" no tienen una tabla asociada, por lo tanto su "parent_id" es 0. Por lo tanto, la "unión interna" anterior no coincidirá. Solo para lectores futuros ya que esta es la respuesta aceptada. – granadaCoder

9
SELECT * 
FROM sys.triggers 
WHERE is_disabled = 0 
5
SELECT 
     TAB.name as Table_Name 
    , TRIG.name as Trigger_Name 
FROM [sys].[triggers] as TRIG 
inner join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 
3
SELECT 
    TAB.name as Table_Name, 
    TRIG.name as Trigger_Name, 
    Comments.Text TriggerText 
FROM [sys].[triggers] as TRIG 
    Inner Join sys.tables as TAB on TRIG.parent_id = TAB.object_id 
    Inner Join syscomments Comments On TRIG.object_id = Comments.id 
WHERE 
    TRIG.is_disabled = 0; 

es solución completa

2
select * from sys.triggers 

Aquí object_id es para la tabla de modo de unirse sys.table puede obtener nombre de la tabla

0

Ésta es la consulta que se produce cuando lo una actualización en "Desencadenadores de base de datos" en SSMS.

SELECT 
tr.name AS [Name], 
'Server[@Name=' + quotename(CAST(
     serverproperty(N'Servername') 
     AS sysname),'''') + ']' + '/Database[@Name=' + quotename(db_name(),'''') + ']' + '/DdlTrigger[@Name=' + quotename(tr.name,'''') + ']' AS [Urn], 
tr.is_disabled AS [IsEnabled] 
FROM 
sys.triggers AS tr 
WHERE 
(tr.parent_class = 0) 
ORDER BY 
[Name] ASC 

Usando eso, he creado una versión (que mejora la respuesta aceptada) para incluir los desencadenantes de la base de datos.

Tenga en cuenta la combinación izquierda y la comprobación COALESCE.

SELECT 
     COALESCE(TAB.name, 'DATABASE') as TargetObjectName 
    , TRIG.name as Trigger_Name 
    , TRIG.is_disabled --or objectproperty(object_id('TriggerName'), 'ExecIsTriggerDisabled') 
    -- select * 
FROM [sys].[triggers] as TRIG 
left join sys.tables as TAB 
on TRIG.parent_id = TAB.object_id 
WHERE 
/* (TRIG.parent_class = 0) and */ 
TRIG.is_disabled = 0 
1
select so.name, text 
from sysobjects so, syscomments sc 
where type = 'TR' 
and so.id = sc.id 
and text like '%related_table_name%' 
+0

Esto funcionó muy bien para mi base de datos 2005. Gracias. –

0

// utilizar su base de datos uso [Nombre de base de datos]

Seleccionar * de sys.triggers donde is_disaabled = 0

+0

¿Puede explicar su respuesta? –

Cuestiones relacionadas