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 22/12/2011, 13h11   #1
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Par défaut trigger avec insert

sql server 2005

Bonjour a tous

je souhaite creer un trigger qui creer ecrit dans un fichier txt apres chaque insert sur une table.
J'ai regardé un peu sur internet et voici le trigger que j'ai:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TRIGGER myTrigger
ON VPX_ACCESS
AFTER INSERT
AS
  DECLARE @cmd nvarchar(1024)
  DECLARE @OpC_MsgText nvarchar(1024)
  DECLARE @ID int
  DECLARE @Principal nvarchar(300)
  SELECT @ID = (SELECT ID FROM VPX_ACCESS WHERE ID=9)
  SELECT @Principal = (SELECT PRINCIPAL FROM VPX_ACCESS WHERE ID=9)
  	BEGIN
		SET @OpC_MsgText=@ID +  @Principal
		SET @cmd = 'echo ' + @OpC_MsgText + ' > Z:\temp\VMwareView-events.txt'
		EXEC master..xp_cmdshell @cmd, no_output
	END
Lorsque j'execute ce trigger j'ai le message suivant:

Code :
1
2
Msg 245, Level 16, State 1, Procedure myTrigger, Line 12
Error de conversión al convertir el valor nvarchar 'prueba' al tipo de datos int.
Je ne compred pas cette erreur de conversion...
Quelque'un a une idée?

D'avance merci
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 13h24   #2
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Ca vient de cette ligne :

Code :
SET @OpC_MsgText=@ID +  @Principal
Comme il trouve @ID qui est un int, il s'attend à trouver un autre nombre à additionner. Or tu lui balances @Principal qui est du nvarchar.

Converti d'abord @ID en nvarchar, via un CAST; exemple :

Code :
SET @OpC_MsgText=CAST(@ID AS nvarchar(5)) +  @Principal
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 13h36   #3
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour

ok j'ai ceci maintenant:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TRIGGER myTrigger
ON TABLEA
AFTER INSERT
AS
  DECLARE @cmd nvarchar(1024)
  DECLARE @OpC_MsgText nvarchar(1024)
  DECLARE @ID nvarchar
  DECLARE @Principal nvarchar(300)
  SELECT @ID = (SELECT CAST(ID AS nvarchar) FROM TABLEA)
  SELECT @Principal = (SELECT PRINCIPAL FROM TABLEA)
  	BEGIN
		SET @OpC_MsgText=@ID +  @Principal
		SET @cmd = 'echo ' + @OpC_MsgText + ' > Z:\temp\monfichier.txt'
		EXEC master..xp_cmdshell @cmd, no_output
	END
Ça ne fait plus l'erreur du int mais maintenant j'ai une autre erreur qui dit que la subquery retourne plus d'un resultat.

Code :
1
2
3
 
Msg 512, Level 16, State 1, Procedure myTrigger, Line 9
La subconsulta ha devuelto más de un valor, lo que no es correcto cuando va a continuación de =, !=, <, <=, >, >= o cuando se utiliza como expresión.
Si dans ces requetes j'ajoure where ID=x
la ça marche

Code :
1
2
SELECT @ID = (SELECT CAST(ID AS nvarchar) FROM TABLEA)
SELECT @Principal = (SELECT PRINCIPAL FROM TABLEA)
Mais bon je vais voir ça avec les developpeurs...
Merci pour tout !
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 13h54   #4
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Citation:
Envoyé par ldiaz Voir le message
Si dans ces requetes j'ajoure where ID=x
la ça marche
C'est logique puisque tu met dans une variable un retour : si ton select renvoi plusieurs lignes, tu ne peut pas mettre cela dans un scalaire.

Le message est tout à fait clair (sauf si tu as des problèmes avec le castillan )

Rappel toi que dans un trigger SQL SERVER tu peux travailler avec les vue inserted (qui contient les lignes ajoutées ou modifiées) et deleted (pour les trigger update et delete qui contient les valeurs avant suppression/modification).
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 14h55   #5
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Haaa ok
la vue inserted serait l'equivalent des curseurs en PL/SQL
Ok je vais remplacer par la vue en question pour voir.
Cool
Merci encore
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 15h01   #6
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Citation:
Envoyé par ldiaz Voir le message
Haaa ok
la vue inserted serait l'equivalent des curseurs en PL/SQL
Pas du tout.

En gros inserted est l'équivalent de :new, sauf que :new fait référence a une seule ligne. (et les triggers "lignes" n'existe pas en SQL SERVER).
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 16h50   #7
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Bonjour a nouveau

voici mon trigger en entier:

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
36
37
38
39
40
CREATE TRIGGER OVO_notification
ON VE_event
AFTER INSERT 
AS
  DECLARE @cmd nvarchar(1024)
  DECLARE @OpC_MsgText nvarchar(1024)
  DECLARE @OpC_Severity nvarchar(20)
  DECLARE @View_EventID int
  DECLARE @View_EventType nvarchar(512)
  DECLARE @View_Module nvarchar(512)
  DECLARE @View_Severity nvarchar(512)
  DECLARE @View_EventMsg nvarchar(512)
  DECLARE @View_Time datetime
 
  SELECT @View_EventID = (SELECT EventID FROM INSERTED)
  SELECT @View_EventType = (SELECT EventType FROM INSERTED)
  SELECT @View_Module = (SELECT Module FROM INSERTED)
  SELECT @View_Severity = (SELECT Severity FROM INSERTED)
  SELECT @View_EventMsg = (SELECT ModuleAndEventText FROM INSERTED)
  SELECT @View_Time = (SELECT Time FROM INSERTED)
 
  SELECT @OpC_Severity =
    CASE
      WHEN @View_Severity 'INFO' THEN 'normal'
      WHEN @View_Severity 'WARNING' THEN 'warning'
      WHEN @View_Severity 'ERROR' THEN 'critical'
      WHEN @View_Severity 'AUDIT_SUCCESS' THEN 'normal'
      WHEN @View_Severity 'AUDIT_FAIL' THEN 'normal'
      ELSE 'critical'
    END;
 
  BEGIN TRY
    SET @OpC_MsgText = 'MSG: "' + @View_EventID + '|' + @View_EventType + '|' + @View_Module + '|' + @View_Severity + '|' + @View_EventMsg + '|' + @View_Time + '"'
    SET @cmd = 'echo ' + @OpC_MsgText + ' > e:\temp\VMwareView-events.txt'
    EXEC master..xp_cmdshell @cmd, no_output
  END TRY
  BEGIN CATCH
    ### Statements error ###
  END CATCH;
GO
L'erreur est la suivante:

Code :
1
2
3
4
Msg 102, Level 15, State 1, Procedure OVO_notification, Line 27
Incorrect syntax near 'INFO'.
Msg 102, Level 15, State 1, Procedure OVO_notification, Line 41
Incorrect syntax near '###'.

Une idée
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h15   #8
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Ok
il manque le = dans le case...
C'est arrangé

Je ferme ce post tout roule.
Merci a tous et bon NOEL !!!
ldiaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h18   #9
Expert Confirmé Sénior
 
Homme François
Chef de projet NTIC
Inscription : janvier 2007
Messages : 5 353
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Chef de projet NTIC

Informations forums :
Inscription : janvier 2007
Messages : 5 353
Points : 9 747
Points : 9 747
Muy bien. Feliz navidad !
__________________

Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


Une réponse vous a aidé ? utiliser le bouton

"L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel
Bluedeep est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/12/2011, 17h22   #10
Membre habitué
 
Luis
Inscription : avril 2006
Messages : 436
Détails du profil
Informations personnelles :
Nom : Luis

Informations forums :
Inscription : avril 2006
Messages : 436
Points : 119
Points : 119
Jajaja
Muchas gracias
y feliz año nuevo !!
ldiaz 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 20h51.


 
 
 
 
Partenaires

Hébergement Web