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 ; 
4

2 に答える 2

1
  1. 手順の代わりに、IP が正しい場合は 0、正しくない場合は 1 を返す関数を作成します。
  2. b_setting_parametersのようなテーブルを作成しますsetting_parametersが、を使用しENGINE=BLACKHOLEます。これにより、挿入されたものすべてを破棄するテーブルが作成されます (/dev/null など)。
  3. そのブラックホール テーブルに挿入トリガーを作成します。

    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$$
    
  4. b_setting_parameters代わりにテーブルに挿入する必要がsetting_parametersあり、それでうまくいきます。

于 2013-11-14T15:52:21.267 に答える
0

あなたが述べたように、これはDBレベルで行うべきではありません.MySQLトリガーがINSERTまたはUPDATEの防止を許可するとは思いません。

これが成功するのを確認できる唯一の方法は、トリガーがデータを変更してMySQLが挿入できないようにすることです...しかし、MySQLはテーブル定義に合わせてデータを操作することが多いため、それがうまくいくかどうかはわかりません。

于 2013-11-14T15:50:38.740 に答える