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.
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.
Inspirez vous de ce script qui écrit un script de mutation des triggers.
A +
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
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/ * * * * *
Je reviens sur le sujet.
Ce script est super, mais j'ai quelques soucis pour le rendre vraiment dynamique :
- 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
- 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.
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 ?
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):
Ensuite vous pouvez exécuter votre script à l'aide de l'utilitaire SQLCMD
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
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é ?
Bonjour,
Vous pouvez générer le script de votre objet avec un BCP :
Le script généré contient tout votre code ainsi que vos commentaires.
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
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![]()
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 !
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![]()
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager