2009-12-19 78 views
3

在使用Oracle DB一段时间后,我习惯于使用Oracle DB应用程序上下文来实现访问限制。为了简单地把它,在登录过程被称为是把用户的详细信息到Oracle应用程序上下文,像这样:PostgreSQL和/或SQL Server替代Oracle的SYS_CONTEXT

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'); 

我现在已经从甲骨文路程,我使用PostgreSQL为个人项目和SQL Server 2000和2008年的工作。任何人都可以告诉我是否有相应的PostgreSQL或SQL Server提供的功能?

回答

1

在PostgreSQL中,你可能可以通过SECURITY DEFINER这个函数得到当前用户的理由吗?这里记载:http://www.postgresql.org/docs/8.4/static/sql-createfunction.html

编辑:

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

+0

不知道了很多关于这个细节,我认为它使用PostgreSQL的用户?在我描述的方法中,应用程序用户与数据库用户是分开的,并使用一个公共数据库用户连接到数据库。所以上下文是数据库知道应用程序用户连接的方式。任何方式感谢您的答案! – Sevas 2009-12-19 21:05:29

+0

啊,所以你真正想要的是会话变量? HTTP://计算器。COM /问题/ 414541 /基于会话的全局变量功能于PostgreSQL相关的存储过程 – 2009-12-19 21:12:34

0

如果您使用pl/perl(或者如果我正确记得,则为pl/python),您将获得免费的会话变量。

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

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()来实现使用应用程序提供的数据进行数据库层审核。

最后,文件中提到的一些重要的细节,重点煤矿:

LOCAL 的SET的影响只持续,直到当前事务,是否提交或没有结束。

(相比之下,值设定SET的会话范围。)