在表上强制选择强制WHERE

时间:2013-05-26 16:54:15

标签: oracle procedure ora-06550

我有一个包含用户数据的表(电子邮件,姓名,姓名,用户名,密码..),我想让每个用户只看到他自己的数据(比如查看他的个人资料)。我一直试图这样做:

create or replace 
PROCEDURE PR_OWNDATA AS
BEGIN
 FOR userRow IN (SELECT COD_USUARIO, USERNAME FROM CAMP.USERS) LOOP
     EXECUTE IMMEDIATE 'GRANT SELECT ON CAMP.USERS TO "' || userRow.USERNAME || '" WHERE COD_USUARIO = ' || userRow.COD_USUARIO || ';';
 END LOOP;
END PR_OWNDATA;

它不起作用(ORA 06550“行%s,列%s:\ n%s”)。但我看不出问题出在哪里..

我考虑过以这种方式为每个用户创建一个VIEW

CREATE VIEW userRow.USERNAME.V_DATOSALUMNO AS SELECT * FROM CAMP.USERS WHERE COD_USUARIO = ' || userRow.COD_USUARIO || ';';

但我不知道这是不是正确的方法..

提前谢谢。

1 个答案:

答案 0 :(得分:1)

我不明白你给视图的名字,但代码应该是:

CREATE VIEW my_view_name
AS
SELECT *
FROM   CAMP.USERS
WHERE  COD_USUARIO = SYS_CONTEXT('USERENV', 'SESSION_USER')

当然,如果你没有腌制和散列密码那么你就错了。