在使用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是否提供相应的功能吗?
答案 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 LOCAL
和current_setting()
来实现使用应用程序提供的数据进行数据库层审核。
最后,文档中提到的一些重要细节,强调我的:
SET LOCAL 的效果仅持续到当前交易结束,无论是否已提交。
(相反,使用SET
设置的值是会话范围的。)