我们目前每个办公室都有应用程序,只显示那些从办公室登录数据的应用程序,现在这意味着每个办公室都有一个单独的应用程序,这意味着如果我们进行应用程序更改,我必须更新20个不同的应用程序。 / p>
登录通过APEX使用自定义身份验证方案完成,该方案仅允许个人在办公室名称与应用程序匹配时登录。
我想知道的是我如何编写sql查询,当一个人登录时,他们只能看到他们办公室的数据,所以我可以使用一个应用程序,而不是每个办公室都有一个应用程序。 / p>
这是包含登录的表的结构。
"PKEY" NUMBER,
"USERNAME" VARCHAR2(50),
"PASSWORD" VARCHAR2(50),
"NAME" VARCHAR2(50),
"EMAIL" VARCHAR2(50),
"OFFICE" VARCHAR2(50),
CONSTRAINT "LOGINS_PK" PRIMARY KEY ("PKEY")
这是来自用于提交办公室提交信息的当前查询之一的代码。
select "PKEY",
"DATE_SUB",
"CLIENT",
"CANDIDATE",
"RECRUITER",
"CONTACT",
"SALES",
dbms_lob.getlength("RESUME") "RESUME",
"MIMETYPE",
"FILENAME",
"POSITION",
"AVAILABILITY",
"RATE",
"ISSUES",
"WHEN_INT",
"FEEDBACK",
"REQ_PRIORITY",
"OFFICE",
"NOTES",
"REJECT",
"INT_FB"
from "SUBS"
WHERE "OFFICE" = 'OFFICE1'
AND ("REJECT" = 'Accepted' or "REJECT" IS NULL)
AND SALES != 'House'
我想弄清楚的是如何使用登录表中的“OFFICE”字段并将其与“SUBS”表中的“OFFICE”字段进行比较,以便APEX仅向用户显示结果包含与登录表中相同的“OFFICE”标识。
示例:用户Joe Smith以jsmith身份登录,并且他在OFFICE1中,因此当他登录时,他只会在表格的OFFICE字段中看到包含OFFICE1的数据。用户Jane Brown登录到与jbrown相同的应用程序,她在OFFICE2中,因此她只能在OFFICE字段中看到OFFICE2的数据。
提前感谢您的所有帮助!
答案 0 :(得分:1)
使用子查询:
select * from login where office = (
select office from subs where login.office = subs.office
);
这将返回office数据匹配的所有登录行。我可能误解了您的初始问题,您可能需要反向查询:
select * from subs where office = (
select office from login where subs.office = login.office
);
语法是字符不敏感的,因此我缺乏格式化,您可能希望对查询的各个部分进行处理。祝你好运!
答案 1 :(得分:0)
我知道这是一个旧的,但万一其他人需要学习如何做到这一点。
只需在页面上创建一个隐藏字段,并使用像这样的PL / SQL函数体为该字段创建计算。
DECLARE
v_value VARCHAR2(4000);
BEGIN
SELECT NAME
INTO v_value
FROM LOGINS
WHERE USERNAME = :APP_USER;
RETURN v_value;
END;
从你的表中使用你需要的引用(在这种情况下,招募者名称),并且只引用引用该隐藏字段的查询的AND或WHERE子句。