2011-02-03 11 views
14

Być może głupie pytanie!Zadzwoń do przechowywanego procesu po włączeniu spustu wstawki

Jeśli zadzwonię do zapisanego procesu z wyzwalacza After Insert (T-SQL) - to w jaki sposób mogę uzyskać wartości "tylko wstawionych" danych? np.

CREATE TRIGGER dbo.MyTrigger 
    ON dbo.MyTable 
    AFTER INSERT 
    AS 
    BEGIN 

     EXEC createAuditSproc 'I NEED VALUES HERE!' 

nie mam żadnych kolumn tożsamości zmartwienia - Chcę po prostu korzystać z niektórych „tylko” wartości wstawianych przejść do mojego sproc.

Edytuj: Dla wyjaśnienia - potrzebuję tego, aby wywołać sproc i nie zrobić bezpośredniej wstawki do tabeli, ponieważ sproc robi więcej niż jedną rzecz. Pracuję z niektórymi starszymi tabelami, których obecnie nie mogę zmienić, aby poprawnie "działały" (czas/zasób/starszy kod), więc muszę pracować z tym, co mam: (

Odpowiedz

22

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. ..

+4

+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! –

+0

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

+0

@ 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

Powiązane problemy