Dostajesz się do nowo " zmienione”dane za pomocą INSERTED and DELETED pseudo-tabelach:
CREATE TRIGGER dbo.MyTrigger
ON dbo.MyTable
AFTER INSERT
AS
BEGIN
INSERT INTO myTableAudit(ID, Name)
SELECT i.ID, i.Name
FROM inserted i;
END
wziąwszy pod uwagę przykład stoły
create table myTable
(
ID INT identity(1,1),
Name varchar(10)
)
GO
create table myTableAudit
(
ID INT,
Name varchar(10),
TimeChanged datetime default CURRENT_TIMESTAMP
)
GO
Edit: Przepraszam, nie miałem zająć się trochę o wywołanie przechowywanych proc Zgodnie. Komentarz marc_s, zauważ że wstawiono/de leted może zawierać wiele wierszy, co komplikuje sprawy za pomocą SPROC. Osobiście pozostawiłbym włączanie wyzwalacza bezpośrednio w tabeli kontroli bez enkapsulacji SPROC. Jednakże, jeśli masz SQL Server 2008, można użyć parametrów tabeli wycenione, tak:
CREATE TYPE MyTableType AS TABLE
(
ID INT,
Name varchar(10)
);
GO
CREATE PROC dbo.MyAuditProc @MyTableTypeTVP MyTableType READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO myTableAudit(ID, Name)
SELECT mtt.ID, mtt.Name
FROM @MyTableTypeTVP mtt;
END
GO
A następnie wyzwalacz byłyby zmienione tak:
ALTER TRIGGER dbo.MyTrigger
ON dbo.MyTable
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @MyTableTypeTVP AS MyTableType;
INSERT INTO @MyTableTypeTVP(ID, Name)
SELECT i.ID, i.Name
FROM inserted i;
EXEC dbo.MyAuditProc @MyTableTypeTVP;
END
można następnie sprawdzić, czy to działa zarówno dla pojedynczego i wielu wkładek
insert into dbo.MyTable values ('single');
insert into dbo.MyTable
select 'double'
union
select 'insert';
Jednakże, jeśli używasz SQL 2005 lub niższy, prawdopodobnie trzeba używać kursora pętli włożonej przechodząc wiersze do sproc, coś zbyt Horr próbować kontemplować.
Na marginesie, jeśli masz SQL 2008, możesz spojrzeć na Change Data Capture
Edit # 2: Ponieważ trzeba zadzwonić do proc, a jeśli jesteś pewien, że tylko wstawić jeden wiersz. ..
+1, a także pamiętaj, że tabele 'Wstawione' i' Usunięte' będą potencjalnie zawierać kilka wierszy - nie tylko jeden! Nigdy nie zakładaj, że tylko jeden wiersz jest przetwarzany w wyzwalaczu! –
Jak uzyskać te wartości jako przechowywane parametry proc? Czy muszę zadeklarować je wszystkie, a następnie "select @ param1 = val1, @ param2 = val2", a następnie przekazać je? – BlueChippy
@ param1 = val1 jest jednym ze sposobów, ale ponieważ możesz pracować z wieloma wierszami, polecam albo implementację argumentu tabeli, albo użycie kursora, aby wywołać zapisany proces raz dla każdego wstawionego wiersza danych. – Armand