2013-11-14 3 views
0

방아쇠와 저장 프로 시저가 있습니다. 저장 프로 시저에서 IPv4 주소의 유효성을 검사합니다. 주소가 유효하면 DB에 저장됩니다. 그렇지 않으면 내 프로그램이 DB에 빈 레코드를 저장합니다. 나는 IP가 유효하지 않을 때마다 그렇게하고 싶다. 아무 것도 저장할 필요가 없다. 나는 ip가 유효하지 않을 때 과정을 멈추는 방법을 모른다. 유효성 검사는 DB 수준에서 제공해서는 안되지만 이것이 필요하다는 것을 알고 있습니다. 제 코드 수정을 도와 주시겠습니까 ...? 감사합니다 :)트리거 또는 저장 프로 시저에서 데이터베이스에 저장하는 것을 방지하는 방법은 무엇입니까?

당신이 언급 한 것처럼
DELIMITER $$ 
CREATE TRIGGER `validation_test_trigger` BEFORE INSERT ON setting_parameters 
FOR EACH ROW 
BEGIN 
IF(NEW.parameter_name LIKE 'proxy_test') = true THEN 
CALL validate_ip(NEW.parameter_value); 
end IF; 
END$$ 
DELIMITER ; 
DROP PROCEDURE IF EXISTS validate_ip; 
DELIMITER // 
CREATE PROCEDURE validate_ip(INOUT ip VARCHAR(45)) 
BEGIN 
select INET_NTOA(INET_ATON(ip)) into ip; 
IF(ip REGEXP '^([1-9]|[1-9][0-9]|1[013-9][0-9]|12[0-689]|2[0-4][1-9]|25[0-4])\.(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){2}([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][1-9]|25[0-4])$')=0 
THEN 
    SIGNAL SQLSTATE '12345' 
    SET MESSAGE_TEXT = 'Invalid IP!'; 
    END IF; 
END // 
DELIMITER ; 

답변

1
  1. 절차 대신 IP가 맞으면 0을 반환하고 그렇지 않으면 1을 반환하는 함수를 만듭니다.
  2. 과 같은 테이블 b_setting_parameters을 만듭니다 (단, ENGINE=BLACKHOLE).

    CREATE TRIGGER validation_test_trigger BEFORE INSERT ON b_setting_parameters 
    FOR EACH ROW 
    BEGIN 
        IF validate_ip(NEW.parameter_value) = 0 THEN 
        INSERT INTO setting_parameters(col1, col2,...) 
        VALUES (NEW.col1, NEW.col2,...) 
        END IF; 
    END$$ 
    
  3. 이제 테이블 b_setting_parameters에 삽입해야한다 : 즉, (같은을/dev/null)

  4. 그 블랙홀 테이블에 삽입 트리거를 만들에 삽입되는 모든 것을 삭제 테이블을 생성합니다 대신 setting_parameters 그리고 트릭을 할 것입니다.

0

, 이것은 DB 수준에서해서는 안 - 나는 MySQL의 트리거는 INSERT 또는 UPDATE의 예방을 할 수 있다고 생각하지 않습니다.

내가 성공할 수있는 유일한 방법은 트리거가 데이터를 변경하여 MySQL이 삽입 할 수 없도록하는 것이지만 MySQL이 종종 테이블 정의에 맞게 데이터를 조작한다고 가정 할 때, .

+0

오라클은이를 수행 할 수있는 'INSTEAD OF'트리거를 지원합니다. mysql의 경우 blackhole 엔진 플러그인으로 속일 필요가있다. (내 대답 참조) –