2009-08-31 13 views
15

To z Microsoft SQL Server 2008.SQL Server 2008 - Pomoc pisania prostych wyzwalacz INSERT

Mam 2 tabele, pracownika i EmployeeResult i próbuję napisać prosty INSERT wyzwalacz EmployeeResult że robi to - za każdym razem, INSERT odbywa się EmployeeResult takich jak:

(Jack, 200, sprzedaży) (Jane, 300, Marketing) (J, 400, inżynierskie)

należy patrzeć na imię , Pary wprowadzające do działu, takie jak

(Jack, sprzedaż), (Jane, marketing), (John, inżynieria)

w tabeli Employee, a jeśli taki pracownik nie istnieje, należy wstawić je do tabeli Employee.

Co mam jest to z niewiadomych na temat sposobu, aby rozwiązać "???" S:

CREATE TRIGGER trig_Update_Employee 
ON [EmployeeResult] 
FOR INSERT 
AS 
IF EXISTS (SELECT COUNT(*) FROM Employee WHERE ???) 
    BEGIN 
    INSERT INTO [Employee] (Name, Department) VALUES (???, ???) 
    END 

prosimy o pomoc, z góry dzięki

Schema:

Employee 
-------- 
Name, varchar(50) 
Department, varchar (50) 

EmployeeResult 
-------------- 
Name, varchar(50) 
Salary, int 
Department, varchar (50) 

Odpowiedz

58

Ty chcesz skorzystać z tabeli logicznej wstawionej, która jest dostępna w kontekście wyzwalacza. Jest zgodny ze schematem tabeli, do której jest wstawiany, i zawiera wiersz (y), który zostanie wstawiony (w wyzwalaczu aktualizacji masz dostęp do tabel logicznych i, które reprezentują nowe i oryginalne dane odpowiednio.)

Aby wstawić pary pracowników/działów, które obecnie nie istnieją, możesz wypróbować coś takiego.

CREATE TRIGGER trig_Update_Employee 
ON [EmployeeResult] 
FOR INSERT 
AS 
Begin 
    Insert into Employee (Name, Department) 
    Select Distinct i.Name, i.Department 
    from Inserted i 
    Left Join Employee e 
    on i.Name = e.Name and i.Department = e.Department 
    where e.Name is null 
End 
23

cmsjr miało właściwe rozwiązanie. Chciałem tylko wskazać kilka rzeczy na twój przyszły rozwój spustu. Jeśli używasz instrukcji wartości we wstawce w wyzwalaczu, istnieje pewna szansa, że ​​robisz coś niewłaściwego. Wyzwalanie uruchamia się raz dla każdej partii rekordów wstawionych, usuniętych lub zaktualizowanych. Jeśli więc dziesięć rekordów zostało wstawionych do jednej partii, wyzwalacz uruchomi się jeden raz. Jeśli odwołujesz się do danych we wstawianej lub usuniętej oraz używając zmiennych i klauzuli wartości, otrzymasz tylko dane dla jednego z tych rekordów. Powoduje to problemy z integralnością danych. Możesz to naprawić za pomocą wstawki opartej na zestawie, jak cmsjr pokazuje powyżej lub używając kursora. Nigdy nie wybieraj ścieżki kursora. Kursor w wyzwalaczu to problem, który czeka, aby się wydarzyć, ponieważ są one powolne i mogą blokować stół przez wiele godzin. Usunąłem kursor z wyzwalacza i poprawiłem proces importowania z 40 minut do 45 sekund.

Może się wydawać, że nikt nie zamierza dodawać wielu rekordów, ale zdarza się to częściej niż większość osób niebędących bazą danych. Nie pisz wyzwalacza, który nie zadziała pod wszystkimi możliwymi warunkami wstawiania, aktualizowania i usuwania. Nikt nie będzie używał metody pojedynczego rekordu na raz, gdy będzie musiał zaimportować 1 000 000 rekordów docelowych sprzedaży od nowego klienta lub zaktualizować wszystkie ceny o 10% lub usunąć wszystkie rekordy od dostawcy, którego produkty już nie sprzedajesz.

+1

+1: dodatkowy szczegół był pomocny. –

2

sprawdzić ten kod:

CREATE TRIGGER trig_Update_Employee ON [EmployeeResult] FOR INSERT AS Begin 
    Insert into Employee (Name, Department) 
    Select Distinct i.Name, i.Department 
     from Inserted i 
     Left Join Employee e on i.Name = e.Name and i.Department = e.Department 
     where e.Name is null 
End 
Powiązane problemy