Postgres:是set_config()。 current_setting()应用程序变量的私有/健壮堆栈?

时间:2014-09-25 22:30:47

标签: python postgresql psycopg2 postgresql-9.3

在我的应用程序中,我有触发器需要访问用户ID等内容。我正在用

存储这些信息
set_config('PRIVATE.'|'user_id', '221', false)

然后,当我正在进行修改数据库的操作时,触发器可以执行:

user_id = current_setting('PRIVATE.user_id');
它看起来效果很好。我的数据库操作主要来自python,psycopg2,一旦我得到一个连接,我将set_config()作为我的第一个操作,然后继续我的数据库业务。这种做法是好的还是数据从一个会话泄漏到另一个会话?我在plpython中使用SD和GD变量做了这种事情,但是这种语言对于我试图做的事情来说太沉重了所以我不得不转移到plpgsql。

1 个答案:

答案 0 :(得分:5)

虽然它不是真正的设计,但您可以将GUC用作会话变量。

它们也可以是事务范围,SET LOCALset_config等效。

只要您不允许用户运行任意SQL,它们就是合理的选择,并且会话本地GUC不会与其他会话共享。它们不是设计的用于安全会话本地存储,但如果您不使用SET ROLE或{{1},它们可以很方便地隐藏应用程序的“当前用户”等内容为此。

请注意,如果您让他们运行基于SET SESSION AUTHORIZATION的客户端,用户可以通过环境变量定义它们,例如

libpq

此外,在较旧的PostgreSQL版本中,您必须先在$ PGOPTIONS="-c myapp.user_id=fred" psql -c "SHOW myapp.user_id;" myapp.user_id --------------- fred (1 row) 中声明命名空间,然后才能使用它。