我有一张下表:
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中创建一个确保以下内容的策略函数:
3 LEO 4
。 我已授予Scott在由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;
/
select
授予任何用户,则它可以从中获取all行。您必须进一步限制值。
一个选项-我们正在谈论该功能-是在case
子句中使用where
。这里是一个例子。
样本数据:
SQL> create table rating as
2 select 1 id, 'sys' name, 4 score from dual union all
3 select 3, 'leo' , 3 from dual union all
4 select 6, 'scott' , 5 from dual union all
5 select 7, 'hr' , 2 from dual;
Table created.
功能:
upper
函数或类似的东西)]case
说:如果par_user
等于sys
,则让其获取所有行。否则,仅获取名称列的值等于par_user
SQL> create or replace function f_rating (par_user in varchar2)
2 return number
3 is
4 retval number;
5 begin
6 select avg(score)
7 into retval
8 from rating
9 where name = case when par_user = 'sys' then name
10 else par_user
11 end;
12 return retval;
13 end;
14 /
Function created.
让我们尝试:
SQL> select f_rating('sys') rating_sys, 2 f_rating('hr') rating_hr 3 from dual; RATING_SYS RATING_HR ---------- ---------- 3,5 2 SQL>
create view THE_VIEW as select * from TABLE where NAME = user
然后仅授予对视图的访问权限。现在,用户尝试对您的表执行哪种查询都无所谓,她只会返回一行。当然,DBA用户可以访问所有表数据。