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 :

Scripter la création de triggers


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut Scripter la création de triggers
    Bonjour, je dois mettre en place des scripts de création de bases de données, mais j'ai quelque soucis pour mettre en place les triggers sur mes tables.

    L'objectif étant de pouvoir éxécuter mon script et que celui-ci me créé une base type avec des tables sur lesquelles sont placés des triggers, sauf que je ne sais pas comment 'encapsuler' mes CREATE TRIGGERS pour que SQL ne prennent pas mes commandes à la lettre mais plutôt comme un tout. Un peu comme sa
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET @SQL ='
    CREATE TRIGGER [dbo].[UpdateEC] 
       ON  [dbo].[TVAs]
       AFTER UPDATE
    AS 
    BEGIN
    	DECLARE @id int
    	SET @id = (SELECT IdEcriture FROM inserted)
    	INSERT INTO JournalLogs (Identifiant, Date, Action, IP, TypeEvent, TableCible, IdRow)
    	VALUES (ORIGINAL_LOGIN(), CURRENT_TIMESTAMP, ''UPDATE'', NULL, 1, ''TVAs'', @id)
    	SET NOCOUNT ON;
    END
    '
    EXEC(@SQL)
    Mais là, "IdEcriture n'est pas un nom de colonne valide"

    Même sans l'encapsuler dans une variable String, j'ai des problème de redondance de DECLARE @variable car sur certaines tables les triggers à mettre en place sont les-mêmes !

    Comment procéder ?

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Inutile de vous embeter à faire du sql dynamique avec un EXEC... votre seul soucis est que la colonne IdEcriture ne doit pas exister dans la table dbo.TVAS

  3. #3
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Hmm, effectivement, j'ai cru que c'était un problème de contexte mais j'ai juste pas bien réfléchi sur ce coup-là, il semblerait que sa fonctionne, le temps de tester sa.

    Merci !

  4. #4
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    J'ai bel et bien un problème de contexte...
    Je créé mes triggers après ma base (dans mon ordre de script), sauf que mes CREATE TRIGGERS ne passent pas car j'ai des erreur du type "Un déclencheur du type INSTEAD OF DELETE éxiste déja sur l'objet" ou bien quand je précise [BaseDeDonnée].[dbo].[TableCible] il me dit que l'objet d'existe pas 'DANS LE CONTEXTE ACTUEL'

    J'éssaye de mettre des USE dans mon script seulement si je place le USE dans l'encapsulation du CREATE TRIGGER
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     SET @SQL = 'USE ['+@BDD+'] 
    CREATE TRIGGER ...
    SQL Server me retourne l'érreur : "CREATE TRIGGER doit être la première instruction..." Et quand j'éssai de le placer en direct, chronologiquement dans mon script avant l'éxecution du @SQL contenant le(s) CREATE TRIGGER, ben sa me retourne des erreur de syntaxe ou me disant que le nom spécifié après le USE n'est pas bon, n'éxiste pas, ...



    Comment faire ? Comment spécifier le contexte comme étant la base créée juste avant ?

    EDIT : Après test, la solution à mon problème est de réussir à faire passer un USE, en l'inscrivant en dur mes CREATE TRIGGER passent, de l'aide pour la syntaxe ?

    Sachant que le nom de la base de donnée créé est passée en parametre par $(BDD) (-> BDD='UneNewBase') et ensuite encapsulée dans @VAR (SET @VAR= $(BDD))

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Difficile de dire d'où vient l'erreur avec seulement des bouts de code, mais vous pouvez utiliser GO pour "découper" un script en plusieurs lots.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    USE LaBDD
    GO
     
    CREATE TRIGGER UnTrigger
    ...
    GO
    CREATE TRIGGER UnAutreTrigger
    ...
    GO

  6. #6
    Membre confirmé Avatar de StripMat
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2014
    Messages
    206
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 206
    Par défaut
    Moi j'utilise des SET/EXEC pour découper mon code, mais des GO fonctionneraient aussi, je pense qu'avec la bonne syntaxe pour définir le contexte tout devrait passer, car j'ai éssayé en dur mais il faudrait que ce soit dynamique !

    Voici une le début du code
    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
    DECLARE @SQL varchar(max)
    DECLARE @VAR varchar(50)
    SET @VAR = $(BDD)
     
    USE $(BDD)
     
     
    SET @SQL=
    '
    CREATE TRIGGER [dbo].[DeleteEC] 
       ON  [dbo].[EcrituresComptable]
       INSTEAD OF DELETE
    AS 
    BEGIN
    	DECLARE @id int
    	SET @id = (SELECT IdEcriture FROM deleted)
    	INSERT INTO JournalLogs (Identifiant, Date, Action, IP, TypeEvent, TableCible, IdRow)
    	VALUES (ORIGINAL_LOGIN(), CURRENT_TIMESTAMP, ''DELETE'', NULL, 1, ''EcrituresComptable'', @id)
    	SET NOCOUNT ON;
    END
    '
    EXEC(@SQL)
    J'appelle ce code avec cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C:>sqlcmd -S [MonInstance] -v BDD='[bddtest]' -i dossier.sql

Discussions similaires

  1. Création de triggers sous PHPMyAdmin
    Par MakorDal dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 25/02/2007, 18h50
  2. [MySQL] Création de trigger depuis PHP
    Par Shiva dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/01/2007, 13h16
  3. [Débutant] Création de trigger
    Par steph_batman dans le forum Développement
    Réponses: 4
    Dernier message: 06/12/2006, 16h44
  4. [PL/SQL] [9i] Pblm lors de la création de triggers
    Par ftrifiro dans le forum Oracle
    Réponses: 3
    Dernier message: 27/06/2006, 15h08
  5. [IB][IBQUERY][D7 pro] Création de Triggers à la volée.
    Par N1bus dans le forum Bases de données
    Réponses: 6
    Dernier message: 13/10/2004, 14h23

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