【发布时间】:2019-11-30 19:38:49
【问题描述】:
我有一张下表:
id name score
1 SYS 4
2 RHWTT 5
3 LEO 4
4 MOD3_ADMIN 5
5 VPD674 4
6 SCOTT 5
7 HR 4
8 OE 5
9 PM 4
10 IX 5
11 SH 4
12 BI 5
13 IXSNEAKY 4
14 DVF 5
我想在 Oracle SQL 中创建一个策略函数来确保以下几点:
- 如果用户(Leo)在该表上执行选择语句,它只会得到
3 LEO 4。 - sys_dba 无论如何都会得到所有结果。
我已授予 Leo 在 Scott 创建的这张桌子上的选择权限。
我在编写这个复杂的 PL/SQL 函数时遇到了困难。我尝试了以下方法,它指出了编译错误。另外,我认为它没有做我打算做的事情:
CREATE FUNCTION no_show_all (
p_schema IN NUMBER(5),
p_object IN VARCHAR2
)
RETURN
AS
BEGIN
RETURN 'select avg(score) from scott.rating';
END;
/
【问题讨论】:
-
嗯?对不起,但你的功能没有任何意义。所以你想限制根据 oracle 用户名选择哪些记录?
-
是的,完全正确。 sys_dba 获取所有记录。
-
如果您至少有版本 11(¿release 2?},您可能需要查看“标签安全性”。
-
@Abecee - 我想你的意思是Virtual Private Database(因为标签安全是企业版的额外收费)。但即使是 VPD 也需要 EE,并且在标准版中不可用,尽管有趣的是它在 Oracle 18c XE 中得到支持。
-
@APC:实际上,我确实考虑过标签安全性。似乎确实解决了这种情况。但这只是与技术相关的评论 - 忽略了任何许可问题。