2010-07-29 19 views
10

Zgubiłem się, gdy chciałem stworzyć wyzwalacz przy użyciu predefiniowanego "CREATE TRIGGER" SQL Server 2008 R2. Czy mógłbyś podać mi bezpośrednie zapytanie SQL, za pomocą którego mogę stworzyć wyzwalacz i powiedzieć mi, jak zdefiniować AFTER, BEFORE i tak dalej?Utwórz wyzwalacz w SQL Server

Ponadto, w jaki sposób mogę poznać wiersze UPDATED/INSERTED/DELETED i użyć ich wartości kolumn do wykonywania operacji wewnątrz wyzwalacza?

+0

@john: Produkt nosi nazwę "SQL Server", a nie "MSSQL". "MSSQL" można łatwo pomylić z "MySQL". Ponadto, pytając o pytanie SQL Server, sugeruję użycie znacznika "sql-server". "sql" dotyczy ogólnych pytań dotyczących języka SQL. –

+0

Ok dzięki za notatkę. Zrobi to. – johnshaddad

+0

Czy Twoje pytanie dotyczy tylko zdefiniowania wyzwalacza, czy też jest to, jak napisać wyzwalacz, którego można użyć do działania w dotkniętych wierszach? Jeśli później, powinieneś rozważyć zmianę swojego pytania. – Thomas

Odpowiedz

2

Bazy danych są zorientowane na ustawienia i wyzwalacze nie różnią się. Wyzwalacz zostanie uruchomiony, gdy zostanie wykonana dana czynność, a operacja może wpłynąć na wiele wierszy. Zatem, pytanie jest mylące. Może być wstawionych wiele wierszy.

SQL Server udostępnia dwie specjalne tabele dla wyzwalaczy AFTER o nazwach inserted i deleted, które reprezentują wiersze wstawione lub usunięte przez działanie i są skonstruowane identycznie jak tabela, której dotyczy problem. Wyzwalacz aktualizacji może zapełnić zarówno inserted, jak i deleted, natomiast wyzwalacz wstawiania zapełniłby tylko tabelę inserted.

Z opinii:

ale odbiorca e-mail zostanie ustalona na podstawie wartości w drugiej tabeli, gdzie identyfikator klucza obcego znajduje się w pierwszej tabeli (co jest jednym z wyzwalaczem

Odpowiedź na to pytanie polega na użyciu tabeli inserted (która, jak można zakładać, może mieć wiele wierszy), aby przechodzić przez kolejne wiersze i wysyłać wiadomość e-mail, ale nie polecam używania logiki e-mail w wyzwalaczu. , Polecam umieszczenie tej logiki w procedurze przechowywanej i wysłanie e-maila z t kapelusz.

Dla porównania: Create Trigger

+0

A następnie wywołać tę procedurę z wyzwalacza? Czy o to Ci chodziło?Ale czy nie jest wystarczająca procedura systemu pocztowego sql, aby poradzić sobie z tym w wyzwalaczu? lub powinienem utworzyć procedurę, która wywołuje tę procedurę systemową, a następnie wywołać tę procedurę w wyzwalaczu? – johnshaddad

+0

@johnshaddad - Nie. Nie wykonałbym operacji e-mailowych z poziomu wyzwalacza. Zamiast tego chciałbym, aby twój kod wywołujący korzystał z zapisanego procesu, zamiast bezpośrednio operować na tablicy. – Thomas

+0

Kiedy powiedziałeś "Może być wiele wierszy wstawionych." czy to nie uruchamia spustu wielokrotnie? Albo jak? Czy mógłbyś wyjaśnić, w jaki sposób zapętliłbym się w takim przypadku? – johnshaddad

2

Wyzwalacz jest procesem opartym na zdarzeniu, który jest "wyzwalany" po zmianie tabeli w pewien sposób. Będzie to dotyczyć DELETE, UPDATE, INSERT i tak dalej. Składnia PRZED i PO będzie określała, czy uruchamiać wyzwalacz przed lub po zdarzeniu.

To jest krótka wersja. Sprawdź MSDN.

+0

Tak, znam wyzwalacze na MySQL, ale nie na MSSQL, więc pomyślałem, że jest inny sposób implementacji. Dzięki! – johnshaddad

+0

Ale skąd mogę wiedzieć, który wiersz jest aktualizowany? Powiedz, że chcę poznać klucz podstawowy tego rzędu, jak to zrobić? Coś jak wysłać wiadomość e-mail po dodaniu nowego przedmiotu, ale odbiorca wiadomości e-mail zostanie wybrany na podstawie wartości w drugiej tabeli, w której identyfikator klucza obcego znajduje się w pierwszej tabeli (która jest tym z wyzwalaczem). – johnshaddad

+0

mrdenny's komentarz w odpowiedzi na odpowiedź Joela Coehoorna jest dobrym podsumowaniem. –

10

Podstawowa składnia jest

CREATE TRIGGER YourTriggerName ON dbo.YourTable 
FOR|AFTER INSERT, UPDATE, DELETE 
AS 
BEGIN 
    /*Put what ever you want here*/ 
    UPDATE AnotherTable 
      SET SomeColumn = AnotherColumn 
    FROM inserted | deleted 
END 
GO 
+0

Próbuję tego i to nie działa dla mnie na serwerze MS. –

Powiązane problemy