IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

PS - désactiver tous les triggers d'une base de données sur unr serveur lié [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Points : 18
    Points
    18
    Par défaut PS - désactiver tous les triggers d'une base de données sur unr serveur lié
    Bonjour,

    J'ai une procédure qui permet de désactiver tous les triggers d'une table sur un serveur local

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    DECLARE @tableName	VARCHAR(40)
    DECLARE @triggerName	VARCHAR(40)
     
    DECLARE cTriggers CURSOR FOR
    	SELECT	o.name, t.name 
    	FROM	        SYS.TRIGGERS t, SYS.TABLES o, SYS.SCHEMAS s 
    	WHERE	t.parent_id = o.object_id AND	o.schema_id = s.schema_id 
    	AND		t.name not like 'BIN$%' AND	t.is_disabled = 0 AND o.name = 'NomTable'
     
    OPEN cTriggers
    FETCH NEXT FROM cTriggers INTO @tableName, @triggerName
     
    WHILE( @@FETCH_STATUS <> -1 )
    BEGIN
    	ALTER TABLE @tableName DISABLE TRIGGER @triggerName   
     
    	FETCH NEXT FROM cTriggers INTO @tableName, @triggerName
    END
    CLOSE cTriggers
    DEALLOCATE cTriggers
    Je recherche le moyen de faire la même chose sur une table d'un serveur distant/lié.

    Merci d'avance pour vos réponses

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Je doute sincèrement que vous ayez même testé cette procédure stockée, car le code suivant est impossible à exécuter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE @tableName DISABLE TRIGGER @triggerName
    C'est pour cette raison que l'on doit passer par du code SQL dynamique, c'est à dire une chaîne de requête SQL générée puis exécutée.
    Pour voir quelques exemples de code SQL dynamique, vous pouvez jeter un œil à la réponse que j'ai donnée ici.

    En outre, l'utilisation d'un curseur n'est pas nécessaire pour ce que vous cherchez à faire, et est, plus généralement, très contre-performante.
    Veillez également à spécifier les prédicats de jointure suivant la norme SQL ANSI, c'est à dire en utilisant le mot-clé JOIN et ses cinq types possibles.

    Par ailleurs :

    • je suppose qu'une fois que les triggers auront été désactivés, on doit réaliser quelques tâches de maintenance de données, puis les réactiver.
      Donc il vous faut un mécanisme simple pour activer ou désactiver les déclencheurs.
    • un trigger peut être posé sur une table, mais aussi sur une vue. Donc il faut faire une jointure avec sys.objects.
    • tout objet est dans un schéma; par défaut c'est dbo dans SQL Server, et il est possible qu'à l'avenir vous deviez gérer des triggers dans d'autres schémas que dbo.


    Si l'on prend en compte tout cela, on aboutit au bout de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    DECLARE @sql nvarchar(max)
    	, @enable_triggers bit = 0
     
    -- On concatène les chaînes de requête dans la variable @sql
    SELECT		@sql = CASE WHEN @sql IS NULL THEN '' ELSE @sql END 
    			+ CASE @enable_triggers WHEN 1 THEN 'ENABLE ' ELSE 'DISABLE ' END
    			+ 'TRIGGER ' + S.name + '.' + T.name
    			+ ' ON ' + S.name + '.' + O.name
    			+ ';' + NCHAR(13) + NCHAR(10) -- Retour à la ligne cosmétique
    FROM		sys.schemas AS S -- Couvrons tout schéma de base de données
    INNER JOIN	sys.objects AS O -- Un trigger peut être sur une table ou une vue
    			ON S.schema_id = O.schema_id
    INNER JOIN	sys.triggers AS T
    			ON O.object_id = T.parent_id
    WHERE		S.name = 'dbo'
    AND		O.name  = 'test_trigger'
    AND		T.name NOT LIKE 'BIN$%'
    AND		T.is_disabled = @enable_triggers
     
    -- Sortie de la liste des requêtes dans la console de Management Studio, par exemple
    PRINT @sql
     
    -- Exécution de l'ensemble des ordres générés
    -- Dans le cas d'une utilisation avec des paramètres, voir sp_executesql
    EXEC (@sql)
    Je vous laisse le soin d'encapsuler tout cela dans une procédure stockée

    En ce qui concerne la gestion de triggers sur un serveur lié, il faut que cette procédure stockée soit enregistrée sur le serveur lié : il suffit alors simplement de l'appeler.

    @++

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2013
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 24
    Points : 18
    Points
    18
    Par défaut PS - désactiver tous les triggers d'une base de données sur unr serveur lié
    Merci Elsuket pour votre réponse.

    Effectivement mon code ne pouvait pas marcher en l'état, je suis donc passé par une chaine de caractères.

    Mais votre solution est nettement meilleure et plus performante. Elle combine le fait de pouvoir désactiver ou activer les triggers d'une table en switchant la variable @enable_triggers de 0 (DISABLE) à 1(ENABLE).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Remplacer un nom dans tous les champs d'une base de données
    Par dudux2 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 11/11/2014, 10h32
  2. [AC-2007] Partager une base de données sur un serveur et limiter les accés
    Par tounam dans le forum Sécurité
    Réponses: 2
    Dernier message: 07/09/2011, 14h32
  3. [ODBC] [Access] Supprimer tous les enregistrements d'une base de données
    Par Medmidou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 31/05/2009, 12h52
  4. lister et imprimer contenu de tous les triggers d'une base
    Par tibofo dans le forum Développement
    Réponses: 3
    Dernier message: 28/10/2008, 21h52
  5. Peut on visualiser tous les triggers d'une base ?
    Par antonius_marcus dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/04/2008, 08h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo