2014-03-05 2 views
0

나는 트리거를 만들려고했지만 시도는 실패했습니다. 오류가 발생하는 것 같습니다 (# 1064). 나는 해결책이 없습니다. 누군가가 구문에서 어떤 결함을 설명하거나 설명 할 수 있습니까?SQL 내에서 트리거를 만드는 방법

저를 지정할 수 있습니다 : I 배달 테이블, 나는 또한 entry_log 테이블의 외래 키로 delivery_id 한에서 기본 키로 delivery_id 한

. (true의 경우) 모두의 id를 비교함으로써 는 텍스트가 비트의 출력을 참조합니다 (0 또는 1)

DELIMITER // 
    DROP TRIGGER IF EXISTS entry_trigger// 

    CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log 
    FOR EACH ROW 
    BEGIN 

    DECLARE @xentry VARCHAR(45) 
    DECLARE @inta bit 

    SET @inta = SELECT allowed 
    FROM delivery 
    WHERE delivery.delivery_id = entry_log.delivery_id; 


CASE 
    when @inta = 0 then @xentry = 'Acces Denied' 
    when @inta = 1 then @xentry = 'Acces Allowed' 
END CASE 

    INSERT INTO entry_log(entry_time,access_allowed) VALUES(now(),@xentry); 

END 
// 

답변

1

이 당신이 MySQL을 사용한다고 가정한다 반환합니다. 사용하는 방아쇠의 몸체

트리거가 실행되는 entry_log 항목과 비교하고 싶다고 생각합니까? 이 경우 다음 구문을 사용해야합니다.

here 자세한 예를 참조하십시오.

UPDATE 나는 또한 당신이 트리거 내에서 INSERT INTO entry_log을하려고 볼

. 무한 재귀 루프를 생성하기 때문에 물론 작동하지 않습니다. 트리거의 본문 내에서 관련없는 테이블 액세스를 수행 할 수 있지만 삽입하려는 테이블에는 액세스 할 수 없습니다. 당신은 당신의 CASE 문이 올바른지, UPDATE 2

내가 의심 NEW.xyz = whatever

설정 값이 트리거에 의해 삽입 할 변경할 수 있습니다. 적어도 END CASE으로 끝나야합니다. 주소를 지정할 사례가 많지 않으므로 여기에서 IF을 사용할 수 있습니다. 당신이 CASE를 사용해야하는 경우이 게시물에 당신을 도울 수 있습니다 MYSQL Trigger set datetime value using case statement

UPDATE 3 나는 잘 모르겠지만, 난 당신이 변수 설정 문 주위에 괄호를 필요가 있다고 생각합니다. 이 내 머리에서 작성되어,

DELIMITER // 
DROP TRIGGER IF EXISTS entry_trigger// 

CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log 
FOR EACH ROW 
BEGIN 
    SET @inta = (SELECT allowed 
       FROM delivery 
       WHERE delivery.delivery_id = NEW.delivery_id); 

    SET NEW.access_allowed = @inta; 
    SET NEW.entry_time = NOW(); 
END 
// 

주, 나의 스크립트 구문 오류에주의 :이 트리거 정의를 시도합니다.

+0

해당 CASE 문도 문제입니까? IF 문이 아니거나 다음 INSERT에 CASE가 삽입되어 있습니까? – MatBailie

+0

잘 모르겠습니다. 방금 첫 번째 문제를 보았습니다. 더 있습니다. 내가 대답을 업데이 트에 주소를 – luksch

+0

나는 끝으로 변경했습니다 : 나는 여전히 라인 5 (# 1064)에 오류가 나타납니다 – theone

관련 문제