je complète mon article Trigger SQL interdiction modification champs avec un contrôle moins bloquant pour les utilisateurs mais avec un meilleur contrôle. Cette fois-ci, j’autorise les utilisateurs à changer le statut « sommeil » d’un client Sage dans la table F_COMPTET mais je vais faire un log des utilisateurs qui font ce changement.
Pour cela je me suis basé sur mon trigger précédent et des scripts de Jack Worthen accessibles sur cet article
Je commence par créer la table de logs (n’oubliez pas de changer le nom de votre base SQL Server Sage) avec un id, le numéro du client modifié et le nom de l’utilisateur suivant s’il est en comptabilité, gestion commerciale ou moyens de paiement et la date/heure de modification.
USE [NOM_DE_MA_BASE_SAGE] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[ChangeLog]( [LogId] [INT] IDENTITY(1,1) NOT NULL, [ct_num] [VARCHAR](17) NULL, [CPTA] [VARCHAR](256) NULL, [CIAL] [VARCHAR](256) NULL, [TRES] [VARCHAR](256) NULL, [EventDate] [DATETIME] NULL ) GO
Je passe ensuite à la création du trigger. Pour cela je vais chercher les modifications dans la table cbnotification en liant le cbuser au cbworkstation ne sachant pas sur quel logiciel va avoir lieu la modification. la clé sera le cbmarq de f_comptet. Je prends la dernière modification et j’enregistre dans la table.
USE [NOM_DE_MA_BASE_SAGE] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO create TRIGGER [dbo].[backup_objects] ON [dbo].[F_COMPTET] FOR UPDATE AS SET NOCOUNT ON declare @num_client varchar(17); declare @CPTA varchar(256); declare @CIAL varchar(256); declare @TRES varchar(256); declare @cbmarq int; if UPDATE(ct_sommeil) BEGIN select @num_client= inserted.ct_num from inserted select @cbmarq = cbmarq from F_COMPTET where ct_num = @num_client select @CPTA = c1.cbUserName, @CIAL = c2.cbUserName, @TRES = c3.cbUserName from cbNotification left join cbUserSession c1 on cbUser = c1.cbsession and c1.cb_type = 'CPTA' left join cbUserSession c2 on c1.cbWorkstation = c2.cbWorkstation and c2.cb_type = 'CIAL' left join cbUserSession c3 on c1.cbWorkstation = c3.cbWorkstation and c3.cb_type = 'TRES' left join F_COMPTET on cbNotification.cbMarq = F_COMPTET.cbMarq where cbmodif = (select top 1 cbmodif from cbNotification where cbFile = 'F_COMPTET' and cbMarq = @cbmarq) order by cbModif desc INSERT INTO changelog(ct_num, CPTA, CIAL, TRES, EventDate) VALUES(@num_client, @CPTA, @CIAL, @TRES, GETDATE()) END
Vous pouvez ensuite consulter la table ChangeLog qui va se remplir au fur et à mesure des modifications du champs ct_sommeil !