セッションの設定-ユーザーIDを格納するカスタム変数


10

ユーザーIDをカスタムセッション変数に保存し、それをトリガープロシージャで使用(読み取り)して、ユーザーアクションを承認します。私はこのようなものを見つけました:

set session "myapp.user" = '12345';
...
SELECT current_setting('myapp.user');

動作するようです-"myapp.user"は.confファイルで宣言する必要があると思いましたが、その場でセッション変数を作成できるようです(私は.confファイルをまったく変更していません)。

このようにすることの欠点はありますか?


2
myapp.userで宣言しなければならない制限postgresql.confは9.2または9.1で削除されたと思います
a_horse_with_no_name

5
これは、ユーザーが任意のSQLを実行することを許可されていない限り、適切な方法です(この場合、ユーザーは別のユーザーIDを設定するだけで済みます)。これは、PostgreSQLの真のセッション変数の欠如に対するちょっとしたハックな回避策ですが、それに関する重大な問題は知りません。ところで、参照として使用した関連する以前の質問/回答にリンクしてください。
クレイグリンガー

回答:


8

バージョン9.2より前custom_variable_classespostgresql.conf、次のようにカスタムクラス変数をのパラメーターに追加する必要がありました。

custom_variable_classes = 'myapp'

では9.2、この要件は削除されました

custom_variable_classesパラメータを削除しました。(Tom Lane)

この設定によって提供されるチェックは疑わしいものでした。これで、任意の設定の前に任意のクラス名を付けることができます。

したがって、9.2以降では、現在行っているようにカスタムクラス変数を設定するだけでよく、変更を心配する必要はありませんpostgresql.conf



0

このようなケースでは、次のようなplperl関数を作成します。

CREATE OR REPLACE FUNCTION session_store(key text,val text DEFAULT NULL)
  RETURNS text AS
$BODY$
my ($k,$v)=@_;
die "key cannot be NULL\n" unless defined $k;
if (defined $v) {
    $_SHARED{session_store}{$k}=$v;
    return undef;
}
return exists $_SHARED{session_store}{$k}?$_SHARED{session_store}{$k}:undef;
$BODY$
LANGUAGE plperl VOLATILE;

これの利点は、SQLステートメントでも機能することです。次に例を示します。

select session_store('user',12345::text);
insert into mytable(userid) values(session_store('user')::integer);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.