2012-03-09 5 views
10

La mia applicazione è basata su un server sql db.Come ottenere l'elenco di trigger attivi su un database?

Tutti i clienti hanno lo stesso db tranne le personalizzazioni.

Alcune personalizzazioni includono: nuovi tavoli, modificati, viste personalizzate, trigger personalizzato ...

Quando eseguo l'aggiornamento del software vengono eseguiti alcuni script. Ora disattivo manualmente i trigger e riattivato dopo che gli script sono stati eseguiti.

In ogni caso, mi piacerebbe disattivare automaticamente tutti i trigger (che sono abilitati, alcuni potrebbero essere già disabilitati) e quindi riattivarli alla fine.

Non reinventare il whell, come farlo?

Come ottenere solo i trigger attivi sul db corrente?

Una volta ho avuto questo posso programmazione creare ed eseguire il

DISABLE TRIGGER triggername ON TABLENAME 

ENABLE TRIGGER triggername ON TABLENAME 
+0

possibile duplicato di [SQL Server: verificare se un Trigger è Abilitato o Disabilitato?] (Http: // StackOverflow.it/questions/8136937/sql-server-check-if-a-trigger-is-enabled-or-disabled) – michaelAngelo

risposta

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

1 significa vero, 0 significa falso ovviamente

interrogazione Usa Jeff O e ​​modificare un po '

o aggiungerlo come una clausola dove.

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

Scelgo questo come risposta anche se tutti fossero corretti, questo semplicemente è "perfetto". – LaBracca

+1

Nota: "Trigger del database" non ha una tabella associata, quindi il suo "parent_id" è 0. Quindi il "inner join" sopra non corrisponderà. Solo per i futuri lettori in quanto questa è la risposta accettata. – 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; 

è la soluzione completa

2
select * from sys.triggers 

Qui object_id è per la tavola in modo da unirsi sys.table è possibile ottenere il nome della tabella

0

Qui è la query che si verifica quando si fa un aggiornamento su "Trigger del database" in 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 

Utilizzando ciò, ho creato una versione (che migliora la risposta accettata) per includere i trigger del database.

Nota il join sinistro e il controllo 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

Questo ha funzionato alla grande per il mio database del 2005. Grazie. –

0

// utilizzare il database utilizzo [Nome database]

Select * from sys.triggers dove is_disaabled = 0

+0

Puoi approfondire la tua risposta? –