在 Oracle Sql 开发人员的视图的 WHERE 子句中使用 USER
Use of USER in WHERE clause of a view in Oracle Sql Developer
我找不到与此问题相关的任何信息,因为它非常具体。情况是我创建了一个视图,该视图应该根据调用它的用户 return 结果。视图如下:
CREATE VIEW V_ClientReward AS
SELECT cl.id, EXTRACT(YEAR FROM r1.recommendationDate) AS
yearRecommended,
COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT
NULL) GROUP BY r2.client1), 0) AS numberRecommendedContracted,
COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 NOT IN(SELECT id FROM Client WHERE registrationDate IS
NOT NULL) GROUP BY r2.client1), 0) AS numberRecommendedNotContracted,
((SELECT rewardImport FROM ClientReward WHERE rewardYear = EXTRACT(YEAR
FROM r1.recommendationDate))*COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT
NULL)
GROUP BY r2.client1), 0)) AS totalEarned
FROM Client cl INNER JOIN Recommendation r1
ON cl.id=r1.client1
INNER JOIN WebClient
ON idUser = cl.id
WHERE nick = USER
GROUP BY cl.id, EXTRACT(YEAR FROM r1.recommendationDate);
想法是,在我在此视图上授予用户 SELECT
之后,通过 SELECT * FROM P18.V_ClientReward
调用它的简单操作应该会根据该用户的姓名获得结果。
不幸的是,当我执行它时,我根本没有得到任何结果,只有空字段。我已经尝试执行将有问题的用户直接指定为 WHERE nick = 'user_name'
的查询,并且效果很好。
如有任何帮助,我们将不胜感激。
谢谢。
我没有你的 table,所以我用我自己的一个。
一、table内容:列NICK用于区分数据库用户(scott & hr)。 table 属于用户 SCOTT。
SQL> connect scott/tiger@xe
Connected.
SQL> select id_emp, fname, nick
2 from person;
ID_EMP FNAME NICK
---------- -------------------- --------------------
1 Little HR
2 Charles HR
3 Rio HR
4 Seb SCOTT
5 Romain SCOTT
创建视图,使用您使用的 where
子句:
SQL> create or replace view v_person as
2 select id_emp, fname
3 from person
4 where nick = user;
View created.
授予用户 HR 权限(否则,它将看不到任何内容):
SQL> grant select on v_person to hr;
Grant succeeded.
好的,让我们检查一下这些用户看到了什么。
SQL> show user
USER is "SCOTT"
SQL> select * from v_person;
ID_EMP FNAME
---------- --------------------
4 Seb
5 Romain
SQL> connect hr/hr@xe
Connected.
SQL> -- including the owner's name:
SQL> select * from scott.v_person;
ID_EMP FNAME
---------- --------------------
1 Little
2 Charles
3 Rio
SQL>
好像还可以吧?
关于你的问题:你有没有使用小写 nick 值?
SQL> update person set nick = 'scott' where id_emp > 3;
2 rows updated.
SQL> select * From v_person;
no rows selected
SQL>
如果没有,您能否创建一个相同的简单示例,清楚地说明您所做的事情?
我找不到与此问题相关的任何信息,因为它非常具体。情况是我创建了一个视图,该视图应该根据调用它的用户 return 结果。视图如下:
CREATE VIEW V_ClientReward AS
SELECT cl.id, EXTRACT(YEAR FROM r1.recommendationDate) AS
yearRecommended,
COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT
NULL) GROUP BY r2.client1), 0) AS numberRecommendedContracted,
COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 NOT IN(SELECT id FROM Client WHERE registrationDate IS
NOT NULL) GROUP BY r2.client1), 0) AS numberRecommendedNotContracted,
((SELECT rewardImport FROM ClientReward WHERE rewardYear = EXTRACT(YEAR
FROM r1.recommendationDate))*COALESCE((SELECT COUNT(*)
FROM Recommendation r2
WHERE r2.client1 = cl.id AND
EXTRACT(YEAR FROM r2.recommendationDate)= EXTRACT(YEAR FROM
r1.recommendationDate)
AND r2.client2 IN(SELECT id FROM Client WHERE registrationDate IS NOT
NULL)
GROUP BY r2.client1), 0)) AS totalEarned
FROM Client cl INNER JOIN Recommendation r1
ON cl.id=r1.client1
INNER JOIN WebClient
ON idUser = cl.id
WHERE nick = USER
GROUP BY cl.id, EXTRACT(YEAR FROM r1.recommendationDate);
想法是,在我在此视图上授予用户 SELECT
之后,通过 SELECT * FROM P18.V_ClientReward
调用它的简单操作应该会根据该用户的姓名获得结果。
不幸的是,当我执行它时,我根本没有得到任何结果,只有空字段。我已经尝试执行将有问题的用户直接指定为 WHERE nick = 'user_name'
的查询,并且效果很好。
如有任何帮助,我们将不胜感激。
谢谢。
我没有你的 table,所以我用我自己的一个。
一、table内容:列NICK用于区分数据库用户(scott & hr)。 table 属于用户 SCOTT。
SQL> connect scott/tiger@xe
Connected.
SQL> select id_emp, fname, nick
2 from person;
ID_EMP FNAME NICK
---------- -------------------- --------------------
1 Little HR
2 Charles HR
3 Rio HR
4 Seb SCOTT
5 Romain SCOTT
创建视图,使用您使用的 where
子句:
SQL> create or replace view v_person as
2 select id_emp, fname
3 from person
4 where nick = user;
View created.
授予用户 HR 权限(否则,它将看不到任何内容):
SQL> grant select on v_person to hr;
Grant succeeded.
好的,让我们检查一下这些用户看到了什么。
SQL> show user
USER is "SCOTT"
SQL> select * from v_person;
ID_EMP FNAME
---------- --------------------
4 Seb
5 Romain
SQL> connect hr/hr@xe
Connected.
SQL> -- including the owner's name:
SQL> select * from scott.v_person;
ID_EMP FNAME
---------- --------------------
1 Little
2 Charles
3 Rio
SQL>
好像还可以吧?
关于你的问题:你有没有使用小写 nick 值?
SQL> update person set nick = 'scott' where id_emp > 3;
2 rows updated.
SQL> select * From v_person;
no rows selected
SQL>
如果没有,您能否创建一个相同的简单示例,清楚地说明您所做的事情?