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 :

[SQL Server 2005] Suppression et création d'un trigger dans une procédure stockée


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut [SQL Server 2005] Suppression et création d'un trigger dans une procédure stockée
    Bonjour à tous,

    Je souhaiterais créer un trigger dynamiquement dans une procédure stockée.
    Le nom de la base ainsi que le nom de la table sur laquelle le trigger sera créé sont passés en paramètres.

    J'obtiens malheureusement le message d'erreur suivant lorsque j'exécute la procédure stockée:

    'CREATE TRIGGER' doit être la première instruction d'un lot de requêtes.
    La procédure stockée vérifie l'existance du trigger, le supprime le cas échéant puis le crée.

    Quelle peut être la solution?

    Merci

  2. #2
    Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2006
    Messages : 52
    Points : 69
    Points
    69
    Par défaut
    bonjour,

    il nous faudrait malheureusement plus de détails sur votre script, avez-vous identifiez à quel niveau se situe l'erreur dans votre code ?

    Christian

  3. #3
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    'CREATE TRIGGER' doit être la première instruction d'un lot de requêtes.
    C'est parce que 'CREATE TRIGGER' doit être la première instruction d'un lot de requêtes

    Blague à part postez votre code complet...
    Placez un GO juste avant votre CREATE TRIGGER cela devrait solutionner votre problème...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Ok, je poste le 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    SET @SQL_Create_Trigger = '	
     
    		USE ['+@DB_Name+']
     
    		IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[dbo].[TRG_01_Log_Modif_'+@TableName+']''))
    		DROP TRIGGER [dbo].[TRG_01_Log_Modif_T_'+@TableName+']
     
    		CREATE TRIGGER TRG_01_Log_Modif_'+@TableName+' ON dbo.'+@TableName+' FOR INSERT, UPDATE, DELETE
    		AS
     
    		DECLARE 
    			@DBName VARCHAR(500),
    			@Bit INT ,
    			@Field INT ,
    			@MaxField INT ,
    			@Char INT ,
    			@FieldName VARCHAR(128) ,
    			@TableName VARCHAR(128) ,
    			@PKCols VARCHAR(1000) ,
    			@SQL VARCHAR(2000), 
    			@UpdateDate VARCHAR(21) ,
    			@UserName VARCHAR(128) ,
    			@Type CHAR(1) ,
    			@PKSelect VARCHAR(1000),
    			@ColumnType VARCHAR(500)
     
    			...
     
     
    '
     
     
     
    EXEC (@SQL_Create_Trigger)
    Je ne poste que l'essentiel.

    Si je mets un 'GO' avant le 'CREATE TRIGGER' je pense qu'il y aura un problème...

  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
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par mad_martigan Voir le message
    Si je mets un 'GO' avant le 'CREATE TRIGGER' je pense qu'il y aura un problème...
    pourquoi donc ?

    prenez juste soin de mettre GO sur une ligne à part, sans autre instruction TSQL

  6. #6
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Si je mets un 'GO' avant le 'CREATE TRIGGER' je pense qu'il y aura un problème...
    A part si vous estimez que le fait que çà marche soit un problème je ne vois pas lequel
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Effectivement pas de problème, ça fonctionne

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Bonjour,

    Je rouvre le ticket car finalement cela ne fonctionne pas..

    J'ai pourtant bien mis un GO une ligne avant le CREATE TRIGGER:

    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
     
    SET @SQL_Create_Trigger = '	
     
    		USE ['+@DB_Name+']
    		GO
     
    		IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N''[dbo].[TRG_01_Log_Modif_'+@TableName+']''))
    		DROP TRIGGER [dbo].[TRG_01_Log_Modif_'+@TableName+']
     
    		GO
    		CREATE TRIGGER TRG_01_Log_Modif_'+@TableName+' ON dbo.'+@TableName+' FOR INSERT, UPDATE, DELETE
    		AS
     
    		DECLARE 
    			@DBName VARCHAR(500),
    			@Bit INT ,
    			@Field INT ,
    			@MaxField INT ,
    .
    .
    .
    Merci,

  9. #9
    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
    Points : 13 092
    Points
    13 092
    Par défaut
    est-ce toujours la même erreur ????

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    oui toujours la même...

  11. #11
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Bonjour, je n'avais pas vu que la requête était en SQL dynamique...

    Celà ne peut pas marcher...

    Vous devez la découper en plusieurs requêtes en pensant à préfixeer vos noms de tables avec le nom de votre base en lieu et place du USE...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  12. #12
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 776
    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 776
    Points : 52 751
    Points
    52 751
    Billets dans le blog
    5
    Par défaut
    GO n'est pas une instruction SQL. C'est une instruction qui s'adresse à l'interpréteur de requête. Vous ne pouvez donc pas mettre GO dasn un script SQL Dynamique.
    La solution est de couper votre script SQL en autant d'exécution que d'instruction.

    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/ * * * * *

  13. #13
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    GO n'est pas une instruction SQL. C'est une instruction qui s'adresse à l'interpréteur de requête. Vous ne pouvez donc pas mettre GO dasn un script SQL Dynamique.
    La solution est de couper votre script SQL en autant d'exécution que d'instruction.

    A +
    C'est dailleurs ce que fais smo...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 94
    Points : 53
    Points
    53
    Par défaut
    Ok, merci pour vos réponses.
    J'ai découpé le script comme prévu et il semble que cela fonctionne bien

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 16/09/2011, 19h35
  2. [SQL-Server 2005] suppression de tables
    Par apersonnat dans le forum Administration
    Réponses: 9
    Dernier message: 15/04/2010, 19h03
  3. [SQL Server 2005] Ordre de création des vues
    Par nox75 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/07/2009, 16h28
  4. [SQL Server 2005] Suppression de serveur lié
    Par nox75 dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 06/11/2008, 14h15
  5. Réponses: 2
    Dernier message: 26/07/2007, 08h35

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