2016-12-08 5 views
0

나는 학생과 주문 테이블이 있습니다. Student 테이블에서 Student ID를 변경할 때 Order의 참조 행을 적절히 업데이트하려고합니다. 트리거를 사용하고 있습니다. 그것은 작동하지 않습니다.SQL Server 트리거 업데이트

create TRIGGER Update_Student 
ON dbo.Student 
AFTER UPDATE 
AS 
BEGIN 
    Declare @oldID int, @newID int 
    Select @oldID = d.StudentID, @newID = i.StudentID 
    from deleted d, inserted i 
    Update Orders 
    set [email protected] where [email protected]oldID 
END 
+0

어떤 오류가 발생하고 있습니까? – Swetha

+0

학생 테이블에서 ID를 변경하지만 주문 테이블에서 ID를 변경하지 않습니다. – jasmine

답변

1

여기에 몇 가지 반 패턴이 있습니다. 그리고 삽입 된 테이블과 삭제 된 테이블을 조인 할 다른 필드가 없다면 현재 코드를 수정할 수 없습니다.

먼저 암시 적 조인을 사용하지 마십시오. 이는 끔찍한 코딩 기술입니다. 그리고 네가 그곳에서 한 것은 거의 네가 원하는 것이 아닌 크로스 조인을했다. 암시 적 조인이 매우 빈약 한 기술인 주된 이유 중 하나이기도합니다.

다음에는 삽입 또는 삭제 된 레코드가 하나만 있다는 잘못된 가정이 있습니다. 이것은 사실이 아니므로 단 하나의 레코드 변경 만 처리하도록 트리거를 설계해서는 안됩니다. 하나의 갱신 명령문에서 1000 명의 학생을 갱신하면 1000 개의 모든 레코드가 삽입되어 삭제됩니다. 코드를 작성한 방법 중 하나만이 트리거에 의해 처리됩니다. 트리거의 스칼라 변수를 삽입 또는 삭제 된 값으로 설정하는 경우 언제든지 데이터 문제가 발생할 수 있습니다.

다음은 거의 항상 나쁜 아이디어 인 학생 테이블의 기본 키가 변경 될 수 있다는 문제점이 있습니다. 기본 키는 절대로 변경하면 안됩니다. 자연 키가 변하지 않습니까? 그렇지 않은 경우 어떤 레코드가 어떤 레코드와 관련되어 있는지 어떻게 알 수 있습니까?

이름을 사용하여 가입 할 수는 있지만 일반적으로 고유 한 값은 아닙니다. 학생 ID가 자동 생성되지 않으면 자동 생성 된 ID 필드를 추가하면 삽입 된 테이블과 삭제 된 테이블을 함께 일치시키는 데 도움이됩니다. 현재 학생 ID가 자동 생성되는 경우이를 업데이트하는 것은 그러한 일을하는 것보다 잘 알고있는 광범위한 데이터베이스 경험이있는 사람들에게만 남겨져 있어야하는 내용입니다.

+0

기본 키를 변경해서는 안되며 논리가 잘못되었습니다. 그러한 코드를 수행하도록 요청 받았기 때문에 정확하고 논리적으로 만들 수있는 방법을 찾고 있습니다. – jasmine

+0

이러한 작업을 수행하는 일반적인 패턴은 부모 테이블에 새 레코드를 만든 다음 하위 레코드를 업데이트하는 것입니다 상위 레코드를 삭제하십시오. 이것은 트리거에서는 거의 수행되지 않지만 저장 프로 시저 또는 스크립트 (일반적으로 스크립트)로 수행됩니다. 대개 일회성 변경입니다. – HLGEM