J'ai examiné certaines réponses précédentes sur les déclencheurs mais je ne trouve pas exactement ce dont j'ai besoin, mais je suis sûr que ma question a déjà été posée/répondu.
J'essaie de garder trace de tous les changements apportés aux colonnes A et B dans le tableau 1.
Si cette valeur change, je souhaite suivre les valeurs en insérant la valeur existante et la nouvelle valeur dans une table différente avec une date.
J'ai essayé d'utiliser quelque chose comme ceci pour l'insertion, mais je ne savais pas comment ajouter les valeurs existantes et nouvelles de la table source (table1):
CREATE TRIGGER NewTrigger ON table1
FOR INSERT
AS
INSERT INTO table2
(columnA , columnB, todaysDate)
.
.
go
J'ai besoin d'utiliser (je pense) le
Before update ON table1 FOR EACH ROW
.
.
.
BEGIN
et regardez à travers toutes les modifications et insérez-les d'abord puis faites de même après la mise à jour?
Quelque chose comme ça devrait faire ce dont vous avez besoin. Vous auriez les instructions INSERT
ci-dessous insérer des valeurs indiquant l'opération effectuée dans MyLogTable
.
CREATE TRIGGER [dbo].[TRIG_MyTable]
ON [dbo].[MyTable]
AFTER INSERT, UPDATE
AS
DECLARE @INS int, @DEL int
SELECT @INS = COUNT(*) FROM INSERTED
SELECT @DEL = COUNT(*) FROM DELETED
IF @INS > 0 AND @DEL > 0
BEGIN
-- a record got updated, so log accordingly.
INSERT INTO MyLogTable
SELECT 'New Values', getdate() FROM INSERTED
INSERT INTO MyLogTable
SELECT 'Old Values', getdate() FROM DELETED
END
ELSE
BEGIN
-- a new record was inserted.
INSERT INTO MyLogTable
SELECT 'Insert', getdate() FROM INSERTED
END
Si vous le souhaitez, vous pouvez également ajouter des colonnes de INSERTED
et DELETED
à votre table de journal si vous souhaitez capturer les valeurs de colonne réellement insérées ou mises à jour.
Ceci est valable pour toutes les modifications et toutes les colonnes, mais vous pouvez modifier votre goût:
USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [dbo].[trMyTrigger]
ON [dbo].[MyTable]
AFTER INSERT, UPDATE, DELETE
NOT FOR REPLICATION
AS
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with caller queries select statements.
-- if an update/insert/delete occurs on the main table, the number of records affected
-- should only be based on that table and not what records the triggers may/may not
-- select.
SET NOCOUNT ON;
-- Determine if this is an insert,update, or delete action
DECLARE @action AS CHAR(1)
DECLARE @count AS INT
SET @action = 'I' -- SET action to 'I'NSERT by default.
SELECT @count = count(*) FROM DELETED
IF @count > 0
BEGIN
SET @action= 'D' -- SET action to 'D'ELETED.
SELECT @count = count(*) FROM INSERTED
IF @count > 0
SET @action = 'U' -- SET action to 'U'PDATED.
END
IF @action = 'D'
-- THIS IS A DELETE RECORD ACTION
BEGIN
INSERT INTO myBackupTable
SELECT *,GETDATE() AS changeDate, 'DELETE' AS task FROM DELETED
END
ELSE
BEGIN
IF @action = 'I'
-- this is an INSERT record action
BEGIN
INSERT INTO myBackupTable
SELECT *,GETDATE() AS changeDate, 'INSERT' as task FROM INSERTED
END
ELSE
-- this is an UPDATE record action
BEGIN
INSERT INTO myBackupTable
SELECT *,GETDATE() AS changeDate, 'UPDATE' as task FROM INSERTED
END
END
créer un déclencheur sur l'abs
au lieu de update comme
declare @idd int , @pricee money
select @idd= ProductID from inserted
select @pricee = ListPrice from inserted
insert into prod values ( @idd , @pricee)
print ' cannot change'
CREATE TRIGGER [dbo].[TRIG_MyTable]
ON [dbo].[MyTable]
AFTER INSERT, UPDATE
AS
DECLARE @INS int, @DEL int
SELECT @INS = COUNT(*) FROM INSERTED
SELECT @DEL = COUNT(*) FROM DELETED
IF @INS > 0 AND @DEL > 0
BEGIN
-- a record got updated, so log accordingly.
INSERT INTO MyLogTable
SELECT 'New Values', getdate() FROM INSERTED
INSERT INTO MyLogTable
SELECT 'Old Values', getdate() FROM DELETED
END
ELSE
BEGIN
-- a new record was inserted.
INSERT INTO MyLogTable
SELECT 'Insert', getdate() FROM INSERTED
END