2009-08-31 2 views
15

를 작성 도움말이 내가 2 개 테이블, 직원 및 EmployeeResult 나는이 작업을 수행하는 EmployeeResult에 간단한 INSERT 트리거를 작성하는 것을 시도하고있어 2008 년SQL Server 2008은 - 간단한 INSERT 트리거

마이크로 소프트 SQL 서버 함께 -는 INSERT 같은 EmployeeResult으로 수행 될 때마다 :

(잭, 200, 판매) (제인, 300, 마케팅) (요한, 400, 엔지니어링)

그것은 이름에 대한 조회한다 , 부서 입력 쌍 (예 :

0123)

(잭, 판매), (제인, 마케팅), (요 공학) Employee 테이블에서

, 및 직원이 존재하지 않는 경우, Employee 테이블에 저를 삽입해야합니다.

내가해야하는 것은 "???"의 해결 방법에 대한 미지수로 이것이다 : 사전에

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 

도와주세요, 감사

스키마 :

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

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

답변

58

당신 트리거의 컨텍스트에서 사용할 수있는 논리 테이블 삽입을 활용하고 싶습니다. 삽입 될 테이블에 대한 스키마와 일치하며 삽입 될 행을 포함합니다 (에 액세스 할 수있는 업데이트 트리거에서이 삭제됨 논리 테이블이 새롭고 원래의 데이터를 나타냄))

따라서 현재 존재하지 않는 직원/부서 쌍을 삽입하려면 다음과 같이 시도해보십시오.

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이 올바른 해결책을 가졌습니다. 나는 당신의 미래 발달 발달을 위해 몇 가지 것을 지적하고 싶었다. 트리거의 삽입에 values ​​문을 사용하는 경우 잘못된 작업을 수행 할 가능성이 있습니다. 삽입, 삭제 또는 업데이트 된 레코드의 각 배치마다 한 번씩 트리거합니다. 따라서 10 개의 레코드가 하나의 배치에 삽입되면 트리거가 한 번 실행됩니다. 삽입 또는 삭제 된 데이터를 참조하는 경우 변수 및 값 절을 사용하면 해당 레코드 중 하나의 데이터 만 가져옵니다. 이로 인해 데이터 무결성 문제가 발생합니다. 위의 cmsjr로 표시된 세트 기반 삽입을 사용하거나 커서를 사용하여이 문제를 해결할 수 있습니다. 커서 경로를 선택하지 마십시오. 트리거의 커서는 느린 속도로 테이블을 잠글 수 있기 때문에 대기중인 문제입니다. 트리거에서 한 번 커서를 제거하고 가져 오기 프로세스를 40 분에서 45 초로 향상 시켰습니다.

아무도 여러 레코드를 추가하지 않을 것이라고 생각할 수도 있지만 대부분의 비 데이터베이스 사용자가 인식하는 것보다 더 자주 발생합니다. 가능한 모든 삽입, 업데이트, 삭제 조건에서 작동하지 않는 트리거를 작성하지 마십시오. 누구도 새로운 고객으로부터 1,000,000 건의 판매 목표 레코드를 가져 오거나 모든 가격을 10 %까지 업데이트하거나 더 이상 판매하지 않는 제품을 판매하는 업체에서 모든 레코드를 삭제해야 할 때 한 번에 한 건의 레코드를 사용하지 않습니다.

+1

1 : 추가 세부 사항 도움이되었다. –

2

체크 코드 :

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