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

MS SQL Server Discussion :

Copie de triggers entre deux bases


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut Copie de triggers entre deux bases
    Bonjour,

    savez vous s'il est possible d'écrire une procédure qui permette de copier les trigger d'une base à une autre ?
    Sans chercher les différences...on drop les triggers de la base de destination et on ajoute tous ceux de la base source.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 966
    Points
    52 966
    Billets dans le blog
    6
    Par défaut
    Inspirez vous de ce script qui écrit un script de mutation des triggers.

    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
    DECLARE @NEWDB NVARCHAR(128)
    SET @NEWDB = 'MaNouvelleDB'
     
    SELECT SQL
    FROM
    (
    SELECT 1 AS N, 'USE ' +  @NEWDB +';'  AS SQL
    UNION ALL
    SELECT 2, text
    FROM   sysobjects AS o
           INNER JOIN syscomments AS c
                 ON o.id = c.id
    WHERE  xtype = 'TR'
    UNION ALL
    SELECT 3 AS N, 'USE ' +  DB_NAME() +';'
    UNION ALL
    SELECT 4, 'DROP TRIGGER ' + DB_NAME() +'..' + name +';'
    FROM   sysobjects AS o
           INNER JOIN syscomments AS c
                 ON o.id = c.id
    WHERE  xtype = 'TR'
    ) AS T
    ORDER  BY N
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Merci beaucoup. Je vais regarder.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Je reviens sur le sujet.
    Ce script est super, mais j'ai quelques soucis pour le rendre vraiment dynamique :
    1. La syntaxe DROP TRIGGER ne supporte apparemment pas le préfixage par le nom de la base comme indiqué dans le script. Du coup pas moyen de passer le nom de la base en parametre
    2. Comment executer ce script automatiquement ? Le probleme est qu'il est beaucoup trop long pour etre contenu dans une variable, donc pas possible via "execute". De plus, étant donné qu'il génère tout en ligne, comme j'ai des cartouches au début de mes triggers indiquant la date de création, l'auteur etc...chaque trigger débute par --=======Auteur : et comme le script met tout en ligne, tout mon trigger est commenté '-_-


    Si vous avez des idées pour ces 2 points je suis preneur.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Pas d'idée ?
    Pour le 1 je pense qu'un "Use @MyBD" devrait faire l'affaire. Mais pour le 2 je suis vraiment perplexe.
    Au départ je voulais transférer les Proc et triggers via SSIS, mais il se trouve qu'apparemment il y a un bug standard sur SSIS qui fait que le transfert ne fonctionne qu'avec le schéma standard dbo (ce qui n'est pas mon cas).
    Du coup j'essaye de faire ca par script de manière dynamique, sans avoir à générer les scripts des procs/triggers pour chaque livraison.

    Personne n'a été confronté à ce probleme ?

  6. #6
    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,

    Vous pouvez plutôt générer un script SQL de vos triggers (clic droit sur la base de données en question / tâches / générer des scripts, cochez vos triggers et c'est parti !)

    Il vous restera à le modifier quelque peu votre script pour remplacer les CREATE par des ALTER si vous êtes certains que tous vos triggers existent sur la base de données cible.
    Dans le cas contraire vous devrez tester l'existence de l'objet dans les vues système (sys.triggers, sys.procedures, sys.tables, et plus généralement sys.objects):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    IF EXISTS
    (
    	SELECT name
    	FROM sys.triggers
    	WHERE name = 'toto'
    )
    BEGIN
    	monTraitement
    END
    Ensuite vous pouvez exécuter votre script à l'aide de l'utilitaire SQLCMD

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Bonjour et merci de votre réponse,

    J'avais deja vu cette possibilité, et c'est d'ailleurs ce que je fais actuellement.
    Mais il y a un inconvénient assez lourd :
    Des qu'on modifie une procédure ou un trigger, il faut regénérer les scripts. Autrement dit, il faut réécrire tout mon script de livraison à chaque fois...
    Je cherche justement une manière dynamique de faire ca.
    SQLPro m'a donné une excellente piste, mais les deux points évoqués un peu plus haut m'empêche d'utiliser le script qu'il m'a fourni :
    1/ Les sauts de lignes n'étant pas conservés, à chaque signe --, tout le reste passe en commentaire.
    2/ Comment faire pour exécuter automatiquement le script généré ?

  8. #8
    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,

    Vous pouvez générer le script de votre objet avec un BCP :

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    CREATE PROCEDURE spGenereScriptTrigger
    	@nomObjet SYSNAME
    AS
    BEGIN
    	DECLARE @BCPCommand VARCHAR(1024),
    		@DROPCommand VARCHAR(512),
    		@schemaName SYSNAME,
    		@SQLCommand VARCHAR(MAX)
     
    	-- Recherche du schéma et de la définition du trigger
    	SELECT @schemaName = S.name,
    		@SQLCommand = SQL.definition
    	FROM sys.objects O
    	JOIN sys.schemas S ON S.schema_id = O.schema_id
    	JOIN sys.sql_modules SQL ON SQL.objet_id = O.object_id
    	WHERE O.name = @nomObjet
    	AND O.type = 'TR'
     
    	-- Création de la commande de suppression du trigger sur la BD cible
    	SET @DROPCommand = 'IF EXISTS (SELECT name FROM sys.triggers WHERE name = ''' + @nomObjet + ''') BEGIN DROP TRIGGER '
    			+ @schemaName + '.' + @nomObjet + ' END' + CHAR(10) + CHAR(13)
     
    	CREATE TABLE ##SCRIPT 
    	(
    		DDLCommand VARCHAR(MAX)
    	)
     
    	-- Insertion dans une table temporaire globale
    	INSERT INTO ##SCRIPT VALUES (@DROPCommand)
    	INSERT INTO ##SCRIPT VALUES (@SQLCommand)
     
    	-- Export du script
    	SET @BCPCommand = 'bcp "SELECT DDLCommand FROM ##SCRIPT" queryout C:\' + @nomObjet + '.sql'
     
    	-- Suppression de la table temporaire globale
    	DROP TABLE ##SCRIPT
    END
    Le script généré contient tout votre code ainsi que vos commentaires.
    Il vous suffit ensuite de le faire exécuter à SQLCMD. Vous pourriez par exemple intégrer le traitement par SQLCMD dans la procédure que je vous propose

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    381
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 381
    Points : 231
    Points
    231
    Par défaut
    Merci beaucoup ! Ca m'a l'air sympathique !
    Je ne connaissais pas BCP. Ca consiste en quoi ? Vous auriez un lien pour en apprendre un peu plus ?
    Je regrette de ne pas être sur mon PC pro pour essayer ce script !

    J'essaye dès que possible !

  10. #10
    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,

    La documentation SQL Server est disponible sur internet et au téléchargement.

    L'utilitaire BCP permet d'importer et d'exporter un très grand nombre de lignes dans / depuis un fichier plat

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

Discussions similaires

  1. Copie entre deux Bases de données
    Par Germaris dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/01/2013, 18h51
  2. trigger entre deux bases distantes
    Par sousoujda2 dans le forum SQL Procédural
    Réponses: 0
    Dernier message: 18/08/2008, 19h09
  3. Requête entre deux bases
    Par dcollart dans le forum Informix
    Réponses: 2
    Dernier message: 22/05/2006, 08h54
  4. Perte de temps entre Deux bases MySQL
    Par ramm50 dans le forum Outils
    Réponses: 7
    Dernier message: 08/09/2005, 09h33
  5. copie de tables entre deux bases
    Par rlgrand dans le forum Débuter
    Réponses: 3
    Dernier message: 27/12/2004, 12h12

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