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 !

Close