PostgreSQL和/或SQL Server替代Oracle的SYS_CONTEXT

时间:2009-12-19 20:32:48

标签: sql-server oracle postgresql

在使用Oracle DB一段时间后,我习惯使用Oracle DB Application Context来实现访问限制。简单地说,在登录时调用一个过程,将用户详细信息放入Oracle应用程序上下文中,如下所示:

DBMS_SESSION.SET_CONTEXT('context_name', 'user_id', user_id);

然后可以通过创建在上下文中查看的视图来强制执行访问,以确定用户可以看到哪些行,如下所示:

CREATE VIEW users_vw AS 
SELECT *
  FROM users
 WHERE user_id = SYS_CONTEXT('context_name', 'user_id');

我现在已经离开了Oracle,并且正在将PostgreSQL用于个人项目,并且正在使用SQL Server 2000和2008。任何人都能告诉我PostgreSQL或SQL Server是否提供相应的功能吗?

3 个答案:

答案 0 :(得分:1)

在PostgreSQL中,您可能会使用SECURITY DEFINER - 在当前用户上推理的功能?记录在这里:http://www.postgresql.org/docs/8.4/static/sql-createfunction.html

编辑:

plperl可用于session variables。还有其他选择(参见评论中的链接),但plperl是最简单的。

答案 1 :(得分:0)

如果您使用pl / perl(或者如果我没记错的话,请使用pl / python),您将免费获得会话变量。

否则 - 当使用plpgsql时 - 您可以使用GUC存储您自己的设置,并以几乎相同的方式使用它。

答案 2 :(得分:0)

您可以使用Postgres“SET or SET LOCAL command来模拟Oracle SET_CONTEXT(),例如如下:

SET LOCAL audit.AUDIT_USER = 'whatever-you-like';
-- alternative:
SELECT set_config('audit.AUDIT_USER', 'whatever-you-like', true);

然后,您可以使用current_setting()检索此值:

SELECT current_setting('audit.AUDIT_USER', true);

(第二个参数true将避免异常,如果参数在查询之前不是SET而是返回NULL。该参数是在Postgres 9.6中引入的,请参阅此问题对于how to do it in Postgres 9.1+。)

我还创建了demo gist of an auditing mechanism利用SET LOCALcurrent_setting()来实现使用应用程序提供的数据进行数据库层审核。

最后,文档中提到的一些重要细节,强调我的:

  

SET LOCAL 的效果仅持续到当前交易结束,无论是否已提交。

(相反,使用SET设置的值是会话范围的。)