48 votes

Quel est le meilleur moyen de vérifier si un déclencheur existe dans SQL Server?

Je suis à la recherche pour la plupart des appareils portables de méthode pour vérifier l'existance d'un déclencheur dans MS SQL Server. Il faut travailler sur, au moins, SQL Server 2000, 2005 et, de préférence, 2008.

L'information ne semble pas être dans INFORMATION_SCHEMA, mais si il est là, quelque part, je préfère l'utiliser à partir de là.

Je ne sais de cette méthode:

if exists (
    select * from dbo.sysobjects 
    where name = 'MyTrigger' 
    and OBJECTPROPERTY(id, 'IsTrigger') = 1
) 
begin

end

Mais je ne suis pas sûr qu'il fonctionne sur toutes les versions de SQL Server.

Donc mes questions sont:

  • Est la au-dessus de la "meilleure" façon?
  • Existe-il des méthodes alternatives?
  • Quels sont leurs avantages et leurs inconvénients?

60voto

marc_s Points 321990

Il existe également la vue de catalogue "sys.triggers" préférée:

 select * from sys.triggers where name = 'MyTrigger'
 

ou appelez la procédure stockée sp_Helptrigger:

 exec sp_helptrigger 'MyTableName'
 

Mais à part ça, je suppose que c'est à peu près tout :-)

Marc

Mise à jour (pour Jakub Januszkiewicz):

Si vous devez inclure les informations de schéma, vous pouvez également procéder de la manière suivante:

 SELECT
    (list of columns)
FROM sys.triggers tr
INNER JOIN sys.tables t ON tr.parent_id = t.object_id
WHERE t.schema_id = SCHEMA_ID('dbo')   -- or whatever you need
 

34voto

wqw Points 6624

Cela fonctionne sur SQL Server 2000 et supérieur

 IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') = 1
BEGIN
    ...
END
 

9voto

BodzioM Points 61

En supposant qu'il s'agisse d'un déclencheur DML:

 IF OBJECT_ID('your_trigger', 'TR') IS NOT NULL
BEGIN
    PRINT 'Trigger exists'
END
ELSE
BEGIN
    PRINT 'Trigger does not exist'
END
 

Pour les autres types d'objets (tables, vues, clés, etc.), voir http://msdn.microsoft.com/en-us/library/ms190324.aspx sous 'type'.

2voto

Lo Sauer Points 5469

En plus de l'excellente réponse de marc_s:

si le contrôle d'existence est prévu avant de supprimer ou de modifier le déclencheur, utilisez un TSQL direct try/Catch bock, comme moyen le plus rapide.

Par exemple:

 BEGIN TRY
    DROP TRIGGER MyTableAfterUpdate;
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS erno WHERE erno = 3701; -- may differ in SQL Server < 2005
END CATCH;
 

Le message d'erreur sera

 Cannot drop the trigger 'MyTableAfterUpdate', because it does not exist or you do not have permission.
 

Ensuite, vérifiez simplement si le résultat exécuté renvoie des lignes ou non, ce qui est facile à utiliser dans SQL direct ainsi que dans les API de programmation (C #, ...).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X