sql >> データベース >  >> RDS >> PostgreSQL

トリガー関数で変数設定を使用するにはどうすればよいですか?

    カスタマイズされたオプション 適切に:

    1. オプションはまだ設定されていません

      それへのすべての言及は例外を引き起こします 、 current_setting() 2番目のパラメータmissing_okで呼び出されない限り マニュアル:

    2. 有効な整数リテラルに設定されたオプション

    3. オプションが無効な整数リテラルに設定されています

    4. オプションのリセット(3の特殊なケースにバーンダウンします。

      たとえば、SET LOCALでカスタマイズされたオプションを設定した場合 またはset_config('myvars.user_id3', '55', true) 、オプション値はトランザクションの終了時にリセットされます。それはまだ存在します 、参照できますが、空の文字列を返すようになりました('' )-integerにキャストできません 。

    デモの明らかな間違いはさておき、4つのケースすべてに備える必要があります。だから:

    CREATE OR REPLACE FUNCTION add_transition1()
      RETURNS trigger AS
    $func$
    DECLARE
       _user_id text := current_setting('myvars.user_id', true);  -- see 1.
    BEGIN
       IF _user_id ~ '^\d+$' THEN  -- one or more digits?
    
          INSERT INTO transitions1 (user_id, house_id)
          VALUES (_user_id::int, NEW.id);  -- valid int, cast is safe
    
       ELSE
    
          INSERT INTO transitions1 (user_id, house_id)
          VALUES (NULL, NEW.id);           -- use NULL instead
    
          RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
                      , quote_literal(_user_id), NEW.id;  -- optional
       END IF;
    
       RETURN NULL;  -- OK for AFTER trigger
    END
    $func$  LANGUAGE plpgsql;
    

    db <> fiddle こちら

    注:

    • 列名と一致する変数名は避けてください。非常にエラーが発生しやすい。一般的な命名規則の1つは、変数名の前にアンダースコアを付けることです:_user_id

    • 宣言時に割り当てて、1つの割り当てを保存します。データ型textに注意してください 。無効な入力を整理した後、後でキャストします。

    • 可能であれば例外を発生させたりトラップしたりしないでください。 。 マニュアル:

    • 有効な整数文字列をテストします。この単純な正規表現では、数字のみが許可されます(先頭記号、空白なし):_user_id ~ '^\d+$' 。無効な入力がある場合はNULLにリセットします。ニーズに適応します。

    • オプションのWARNINGを追加しました デバッグの便宜のために。

    • ケース3. および4. カスタマイズされたオプションが文字列リテラル(タイプtext)であるためにのみ発生します )、有効なデータ型を自動的に適用することはできません。

    関連:

    それはさておき、正確な要件によっては、カスタマイズされたオプションなしで実行しようとしていることに対して、より洗練されたソリューションがある場合があります。多分これ:



    1. JavaからMySQLに画像を保存する

    2. mysqlでのキーセットページネーションのインデックス作成

    3. MySQL:クエリ結果に列を動的に追加する

    4. Laravel:1対1の関係は1対多の関係になります