복붙노트

[SQL] SQL 서버 2008 - 도움말 쓰기 단순 INSERT 트리거

SQL

SQL 서버 2008 - 도움말 쓰기 단순 INSERT 트리거

이것은 마이크로 소프트 SQL 서버 2008입니다.

나는 2 개 테이블, 직원 및 EmployeeResult있어 나는이 수행 EmployeeResult에 대한 간단한의 INSERT 트리거를 작성하려고 해요 -는 INSERT 같은 EmployeeResult로 할 때마다 :

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

그것은 이름에 대해 같은 부서 항목 쌍을 찾아해야

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

이러한 직원이 존재하지 않는 경우 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)

해결법

  1. ==============================

    1.당신은 트리거의 컨텍스트에서 사용할 수있는 삽입 논리 테이블을 활용합니다. 그것은 삽입하고 삽입됩니다 행 (들)을 포함하고있는 테이블의 스키마와 일치 (당신이 각각 새로운 및 원래의 데이터를 나타냅니다 삽입과 삭제의 논리 테이블에 액세스 할 수있는 업데이트 트리거를.)

    당신은 트리거의 컨텍스트에서 사용할 수있는 삽입 논리 테이블을 활용합니다. 그것은 삽입하고 삽입됩니다 행 (들)을 포함하고있는 테이블의 스키마와 일치 (당신이 각각 새로운 및 원래의 데이터를 나타냅니다 삽입과 삭제의 논리 테이블에 액세스 할 수있는 업데이트 트리거를.)

    그래서 현재는 다음과 같은 것을 시도 할 수없는 직원 / 부서 쌍을 삽입합니다.

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

    2.cmsjr는 적합한 솔루션을했다. 난 그냥 당신의 미래 트리거 개발을위한 몇 가지를 지적하고 싶었다. 당신이 트리거에서 삽입의 값 문을 사용하는 경우, 당신은 잘못된 일을하고있는 stong 가능성이있다. 삽입, 삭제 또는 업데이트 된 레코드의 각 배치에 대해 한 번 트리거 화재. 그렇다면 열 개 기록은 다음 트리거 화재 일단, 하나 개의 배치에 삽입되었다. 당신은 삽입 또는 삭제 및 사용 변수의 데이터 다음은 레코드 중 하나에 대한 데이터를 얻을하려고하는 값 절에 다스 려하는 경우. 이 데이터 무결성 문제가 발생합니다. 당신은 위 또는 커서를 사용하여 cmsjr 쇼로 세트 기반 삽입을 사용하여이 문제를 해결할 수 있습니다. 지금까지 커서 경로를 선택하지 마십시오. 트리거에서 커서가 느린 잘 시간 동안 테이블을 잠글 수 있으므로 일이 기다리고 문제입니다. 나는 한 번 트리거에서 커서를 제거하고 45초 40 분 가져 오기 프로세스를 개선.

    cmsjr는 적합한 솔루션을했다. 난 그냥 당신의 미래 트리거 개발을위한 몇 가지를 지적하고 싶었다. 당신이 트리거에서 삽입의 값 문을 사용하는 경우, 당신은 잘못된 일을하고있는 stong 가능성이있다. 삽입, 삭제 또는 업데이트 된 레코드의 각 배치에 대해 한 번 트리거 화재. 그렇다면 열 개 기록은 다음 트리거 화재 일단, 하나 개의 배치에 삽입되었다. 당신은 삽입 또는 삭제 및 사용 변수의 데이터 다음은 레코드 중 하나에 대한 데이터를 얻을하려고하는 값 절에 다스 려하는 경우. 이 데이터 무결성 문제가 발생합니다. 당신은 위 또는 커서를 사용하여 cmsjr 쇼로 세트 기반 삽입을 사용하여이 문제를 해결할 수 있습니다. 지금까지 커서 경로를 선택하지 마십시오. 트리거에서 커서가 느린 잘 시간 동안 테이블을 잠글 수 있으므로 일이 기다리고 문제입니다. 나는 한 번 트리거에서 커서를 제거하고 45초 40 분 가져 오기 프로세스를 개선.

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

  3. ==============================

    3.이 코드를 확인 :

    이 코드를 확인 :

    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
    
  4. from https://stackoverflow.com/questions/1355921/sql-server-2008-help-writing-simple-insert-trigger by cc-by-sa and MIT license