Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/04/2011, 11h06   #1
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
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:

Citation:
'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
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/04/2011, 17h40   #2
Membre régulier
 
Homme Christian Brossault
Administrateur de base de données
Inscription : avril 2006
Messages : 52
Détails du profil
Informations personnelles :
Nom : Homme Christian Brossault
Âge : 39
Localisation : France

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

Informations forums :
Inscription : avril 2006
Messages : 52
Points : 72
Points : 72
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
Christianbt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 07h08   #3
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
'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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 10h59   #4
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Ok, je poste le code:

Code :
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...
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 11h24   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/04/2011, 13h02   #6
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/04/2011, 09h08   #7
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Effectivement pas de problème, ça fonctionne
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 14h48   #8
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
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 :
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,
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 15h07   #9
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
est-ce toujours la même erreur ????
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 08h46   #10
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
oui toujours la même...
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 08h48   #11
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 09h38   #12
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 09h39   #13
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
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 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
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.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 10h13   #14
Membre à l'essai
 
Inscription : juillet 2008
Messages : 92
Détails du profil
Informations forums :
Inscription : juillet 2008
Messages : 92
Points : 21
Points : 21
Ok, merci pour vos réponses.
J'ai découpé le script comme prévu et il semble que cela fonctionne bien
mad_martigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h21.


 
 
 
 
Partenaires

Hébergement Web