j'ai deux tables
Employee (EmpID, Name, UpdatedBy, UpdateDate) EmpContact (ContactID, Contact,EmpID)
UpdatedBy,UpdateDate
de créer un triggersur qui met à jour un champs de table employé par UpdatedBy,UpdateDate
. Lorsque le contact est ajouté ou modifié, je veux mettre à jour les champs UpdatedBy and UpdateDate
(Ces deux tables ont des vues asp.net-mvc différentes). J'utilise le fournisseur d'appartenance par défaut pour authentifier l'user.
Donc, ma question est de savoir comment puis-je get l'user actuellement connecté dans le triggersur qui a initié l'insertion, la mise à jour ou la suppression. Est-il possible que je sache quel identifiant d'user asp.net a initié la transaction dans le TRIGGER
Créer un triggersur d'insertion / mise à jour / suppression qui met à jour la table Emplyoee lorsque des loggings dans EmpContact sont créés / mis à jour / supprimés, par exemple (insert):
CREATE TRIGGER [dbo].[trgCreateEmpContact] ON [dbo].[EmpContact] FOR INSERT AS UPDATE dbo.Employee SET UpdateDate=GetDate(), UpdatedBy = I.UpdatedBy FROM Employee E INNER JOIN Inserted I ON E.EmpID = I.EmpID
Vous devez donc également append la colonne UpdatedBy
à votre table EmpContact.
Vous obtenez l'user actuellement connecté de la manière suivante:
MembershipUser currentUser = Membership.GetUser(); GUID currentUserID = (GUID)currentUser.ProviderUserKey;
Une autre (meilleure) approche serait de créer une procédure stockée qui crée en interne l'logging EmpContact et met à jour la table Employé dans une transaction, par exemple (non testé):
CREATE PROCEDURE [dbo].[InsertEmpContact] @ContactID int OUTPUT, @Contact varchar(50) OUTPUT, @EmpID int OUTPUT, @UpdateDate datetime OUTPUT, @UpdatedBy int OUTPUT, with execute as Owner AS BEGIN TRANSACTION INSERT INTO EmpContact(Contact, EmpID) VALUES (@Contact,@EmpID) ;SELECT @ContactID=ContactID,@Contact=Contact,@EmpID=EmpID,@UpdateDate=GetDate() FROM EmpContact WHERE (ContactID = SCOPE_IDENTITY()) ;UPDATE dbo.Employee SET UpdateDate=@UpdateDate, UpdatedBy = @UpdatedBy WHERE EmpID = @EmpID IF @@ERROR <> 0 BEGIN -- Rollback the transaction ROLLBACK RETURN END COMMIT
Si vous souhaitez détecter l'user connecté depuis le site, veuillez utiliser ces liens
http://www.codeproject.com/KB/aspnet/CustomMembershipProviders.aspx
http://theintegrity.co.uk/2010/11/asp-net-mvc-2-custom-membership-provider-tutorial-part-2/
Cela dépend de la façon dont votre application se connecte à votre database. Si vous le faites, comme la quasi-totalité d'entre nous, avec la mise en commun des connections et un seul user se connectant à la database, la réponse est non, vous ne pouvez pas le savoir dans le triggersur.
Par exemple, l'application se connecte à la database en tant que sa / pwd (ce qui n'est pas conseillé, mais uniquement pour les arguments).
Si l'user un (Paul) se connecte à la database et effectue une mise à jour, votre triggersur obtiendra sa comme user. Si l'user deux (Anne) se connecte à la database, le triggersur obtiendra également sa comme user.
Vous devez donc inclure la mise à jour de l'user dans la mise à jour stat (ou en tant qu'argument de votre procédure stockée)