2016-10-13 3 views
1

다음과 같이 나는 두 개의 테이블이 있습니다SQL 서버 - BEFORE INSERT 트리거

표 1 '의 MySkills'[기본 키 (EMPID, SkillId)]

+----------+------------+---------+----------+-----------+------------+-----------------+----------------+ 
| EmpId | CategoryId | SkillId | ExpYears | ExpMonths | Experience | RatingSubmitted | RatingApproved | 
+----------+------------+---------+----------+-----------+------------+-----------------+----------------+ 
| CSSL9610 | arcgis  | arcgis1 | 0.00  | 0.00  | 0.00  | 1.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis2 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis3 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis4 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis5 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis6 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
| CSSL9610 | arcgis  | arcgis7 | 0.00  | 0.00  | 0.00  | 0.00   | NULL   | 
+----------+------------+---------+----------+-----------+------------+-----------------+----------------+ 

그리고 표 1 '의 MySkills_details을'[기본 키를 (EMPID)]

+-------+------------------+---------------+----------------+--------+---------------+---------+------------+ 
| EmpId | Experience_Prior | Qualification | Specialization | Status | LastSubmitted | NextDue | ApprovedOn | 
+-------+------------------+---------------+----------------+--------+---------------+---------+------------+ 

는 지금 MySkills_details에 데이터가 없습니다. MySkills의 EmpId를 참조하는 EmpID의 외래 키를 만들어야합니다. 이는 MySkills의 복합 기본 키로 인해 불가능합니다. 그래서 나는 다른 방향으로 가기로 결정했습니다. 삽입이 MySkills에서 먼저 발생하고 SQL Server에 BEFORE INSERT 트리거가 없다는 것을 제외하고는 알고 있습니다. 그래서 MySkills에 삽입하기 전에 먼저 MySkill_details에 데이터를 삽입하는 BEFORE INSERT와 같은 트리거를 작성하는 방법.

답변

2

첫 번째 세부 정보 테이블을 검사하는 트리거 대신 다음 SQL Server를 테스트하십시오. 이 경우 누락 된 데이터의 세부가 있으며,이 두 번째 단계에서 해당 테이블 삽입, 그것은 주어진 예를 참조 해주세요 SQL Server instead Of trigger 추가 샘플은 기술 테이블

CREATE Trigger MySkillsInsteadOfInsert on dbo.MySkills Instead Of Insert 
AS 
Begin 

    insert into MySkills_details (
     EmpId -- and other relevant columns 
    ) 
    select i.EmpId -- and other relevant columns 
    from inserted i 
    left join MySkills_details d on i.EmpId = d.EmpId 
    where d.EmpId is null 

    Insert Into MySkills(EmpId) -- and other relevant columns 
    Select EmpId -- and other relevant columns 
    From inserted i; 

End 

삽입을 계속.

하지만 제 생각에 다른 마스터 테이블에 기술을 유지하는 대안 디자인이 될 것입니다. 그리고 세부 사항에 삽입하기 전에 일반적으로 마스터가 존재하는지 확인합니다. 그래서 컨트롤이 일반적으로 반대 방향으로 실행될 수 있습니다. 일반적으로 사용자는 먼저 마스터 데이터를 삽입합니다. 이 경우 스킬 테이블 데이터. 그런 다음 세부 정보가 입력됩니다.

+0

나는 이해하지만, 변경하고 기존 응용 프로그램에 일부 기능을 추가하려고합니다. – ShyProgrammer

+0

만약 내가 최대 였다면, 나는 스킬 테이블에 ID 컬럼을 추가했을 뿐이므로 복잡한 복합 키를 피할 수 있었을 것입니다. – ShyProgrammer

+0

삽입 할 코드를 제안하고 조정할 때 트리거를 생성하여 원하는 것을 얻을 수 있었습니까? MySkills 테이블의 데이터가 응용 프로그램의 비트. 많은 감사 :-) – ShyProgrammer