2014-04-30 2 views
0
ALTER Trigger tr_sal On salaries 
Instead of delete 
AS 
    declare @id int 
    set @id=(select id_teacher from deleted) 
    if @id in (select ID_teacher from techers) 
    BEGIN 
    print 'not able !!' 
    END 
    ELSE 
    BEGIN 
    delete from salaries where [email protected] 
    END 

    delete from salaries 
    where id_teacher=???--(write id) 

:"삭제 대신"트리거가 작동합니까? 내가하고 싶었던 무엇

ID가 교사 인 경우, 당신은 다른 사람이 삭제할 수 있습니다, 그/그녀의 급여를 삭제할 수 없습니다.

둘 다이 실행 얻을 : 수당없이 삭제할 수 없음

  1. 을!
  2. (1 개 행 적용됨)는

내 트리거가 작동 여부되어 있습니까?

답변

0

두 개의 별개의 DELETE 문이 있습니다. 첫 번째 것은 아마도 실행되지 않지만 두 번째 (BEGIN/END 쌍 외부의 것)는 행을 삭제하는 것입니다.

다음 줄의 where과 함께 두 번째 delete from salaries을 완전히 제거하십시오.

0

트리거가 제대로 설계되지 않았습니다. 전혀 어떠한 상황에서도은 삭제되거나 (시작된) 가상 테이블에 하나의 레코드 만 있다고 가정합니다. id의 값을 스칼라 변수로 설정해서는 안됩니다. 20 개의 레코드가 삭제 된 경우 나머지 하나의 트리거 만 영향을받습니다. 트리거는 SQL Server에서 설정 기반으로 행별로 실행되지 않습니다. 이것이 가장 먼저 고쳐야 할 사항입니다. 그리고 트리거에 print 문을 넣지 마십시오. 쓸모가 없습니다. 또한 일부 레코드를 삭제해야하고 다른 레코드를 삭제하면 안되는 경우 트리거가 작동하는 방식을 이해해야합니다.

트리거가 작동하는지 여부를 알기 위해 단위 테스트가 필요합니다.

테이블에서 삭제할 삭제 statment를 작성하십시오. 여러 레코드를 삭제하고 삭제할 것으로 예상하는 레코드와 그렇지 않은 레코드를 선택 통계에서 정확히 알고 있는지 확인하십시오. 실행하십시오 트리거에서 예상 한 동작이 발생했는지 여부와 레코드가 삭제되었거나 삭제되었는지 확인하십시오.

자신의 코드가 작동하는지 알아 내기 위해 인터넷에 접속하지 않아도되고 그렇게하는 방법을 알아야합니다.

논리가 약간 이상합니다. 일반적으로 자식 레코드가 다른 방법으로 존재하지 않는 경우 (FK와 동일) 부모 레코드를 삭제하지 않으려합니다. 부모 레코드를 삭제하려면 먼저 하위 레코드를 삭제해야합니다 (캐스케이드 삭제는 끔찍한 일이지만이 문제가 발생할 수도 있지만 트리거를 테스트하여 교사를 삭제할 때 어떤 일이 발생하는지 확인해야합니다) 따라서 트리거는 의도 한대로 데이터를 유지 관리하는 데 문제가 발생할 수 있습니다.

관련 문제