Bonjour,
J'aimerais passer un parametre dans un trigger
Dans ma base j'ai les tables :
USERS avec les champs
us_id int auto-increment pour l'identifiant
us_civ int (pour la Civilitée) pour la civilité via une autre table
us_lastname nvarchar(50) pour le nom de famille
us_firstname nvarchar(50) pour le prénom
us_login nvarchar(50) pour le login
us_password varbinary(128) pour le mot de passe
USERSHISTORICS (pour historiser les action insert/update/delete sur la table USERS)
uh_id int auto-increment pour l'identifiant
us_id int pour connaitre l'utilisateur qui à été traité
uh_cdate datetime pour connaitre la date de traitement
uh_libelle nvarchar(50) pour indiquer le traitement effectué
us_id_change int pour savoir quel utilisateur à fait le traitement
J'ai fait une procedure stockée Insert user comme suit :
J'ai fait mon trigger comme suis en essayant FOR INSERT ou AFTER INSERT :
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
38
39
40
41
42
43
44
45
46
47
48
49 CREATE PROCEDURE [dbo].[PS_User_Insert] /* Déclaration des variables */ @us_civ int, @us_lastname nvarchar(50), @us_firstname nvarchar(50), @us_login nvarchar(50), @us_password nvarchar(50), @us_id_change int, /* Déclaration de la variable de sortie */ @message nvarchar(250) OUTPUT AS /* Déclaration de la variable password */ DECLARE @password varbinary(128) /* instanciation de la variable password */ SET @password = CONVERT(varbinary, @us_password) BEGIN /* Si le login demandé existe déjà dans la base */ IF EXISTS (SELECT 1 FROM dbo.USERS WHERE us_login=@us_login ) BEGIN /* Si le login demandé existe déjà dans la base mais qu'il est 'Delete' dans l'historique on peut ajouter le user */ IF EXISTS (SELECT 1 FROM dbo.USERS INNER JOIN dbo.USERSHISTORICS ON dbo.USERS.us_id = dbo.USERSHISTORICS.us_id WHERE us_login=@us_login AND dbo.USERSHISTORICS.uh_libelle = 'Deleted') BEGIN INSERT INTO dbo.USERS(us_civ, us_lastname, us_firstname, us_login, us_password) VALUES (@us_civ, @us_lastname, @us_firstname, @us_login, @password) SET @message = 'The user was created' RETURN 0 END /* Sinon on ne peut ajouter le user */ ELSE BEGIN SET @message = 'This login is already in use' RETURN 1 END END /* Sinon on ajoute l'utilisateur */ ELSE BEGIN INSERT INTO dbo.USERS(us_civ, us_lastname, us_firstname, us_login, us_password) VALUES (@us_civ, @us_lastname, @us_firstname, @us_login, @password) SET @message = 'The user was created' RETURN 0 END END
Mon problème c'est que cette variable ne s'instancie pas dans le trigger et reste null :
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 CREATE TRIGGER [dbo].[TG_User_Insert] ON [dbo].[USERS] FOR INSERT AS /* Déclaration de la variable */ DECLARE @us_id_creator int /* Instanciation de la variable */ SELECT @us_id_change = @us_id_change FROM inserted /* Ajoute une entrée dans l'historique */ INSERT INTO dbo.USERSHISTORICS(us_id, uh_cdate, uh_libelle, us_id_change) VALUES (@@IDENTITY, GETDATE(), 'Created', @us_id_change)
Effectivement le paramètre passé à la procédure stockée (@us_id_change) n'est pas utilisé pendant l'insert alors comment dire à mon trigger de prendre le paramètre @us_id_change qui vient de la procédure stockée qui à déclenché l'insert et donc le trigger ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 /* Instanciation de la variable */ SELECT @us_id_change = @us_id_change FROM inserted
Partager