FUNCTION authenticate(p_username IN VARCHAR2,p_password IN VARCHAR2) RETURN
BOOLEAN
is
l_count integer;
begin
select count(*)
into l_count
from STUDENT, ADMIN, ORGANISATION
WHERE upper(Student.STUDENT_ID, ADMIN.ADMIN_ID, ORGANISATION.ORG_ID) =
upper(p_username)
AND upper(Student.STUDENT_PASSWORD, ADMIN.ADMIN_PASSWORD,
ORGANISATION.ORG_PASSWORD) = upper(p_password);
return (l_count > 0);
end;以上是我为从多个表获取信息并使用它们对登录进行身份验证而编写的身份验证代码。如果我只是对学生这样做,它可以正常工作,但我需要多种类型的用户才能访问该软件,而且我不能同时运行多个身份验证方案,同时所有表名和列名都是正确的,下面是我得到的错误ORA-06550:第9行,第7列: PL/ SQL : ORA-00909:无效参数数或-06550:行6,列1: PL/SQL: SQL语句被忽略。
发布于 2018-05-26 21:25:02
语法错误。试一试
select count(*)
into l_count
from student,
admin,
organisation
where upper(p_username) in (upper(student.student_id),
upper(admin.admin_id),
upper(organisation.org_id)
)
and upper(p_password) in (upper(student.student_password),
upper(admin.admin_password),
upper(organisation.org_password)
);发布于 2018-05-28 14:24:45
我想试着打破这个问题,解决这个问题。有许多事情要解决。
逻辑
您将如何控制跨表的唯一性?学生和行政部门都可能有阿尔伯特。它甚至可能是同一个人,一个学生和雇员的设施。我一直都是这样的人。
建议的SQL
您的表之间没有连接,这将将结果转化为一个cartesion产品,而且我确信您可以使用NIKOLA的密码返回true to ALBERT登录。
我想你可能是想用一个集合操作符
select ...
from student
where ...
union all
select ...
from admin
where ...统一意味着没有必要检查唯一性,也不需要额外排序。
密码保护
要能够高于密码,就意味着您要存储它的明文。今天的人们应该继承足够的数字流畅性,以至于密码不应该存储明文。永远不会。
有关如何通过散列密码在APEX中设置自定义身份验证的示例,请参阅本文。在没有散列密码的令人失望的数字中,这是一个罕见的数字。这一个也使用用户名和一些盐,这是更好的。http://barrybrierley.blogspot.com.au/2015/05/custom-authentication-in-apex.html
它还开始满足您对用户类型的需求。
我确信在APEX文档中有一个例子,但是我找不到它。
用户类型-授权
一旦建立了有效的用户,就可以确定他们是哪种类型的用户,然后使用授权方案控制他们对各种组件的访问。
对于更灵活的系统,我将进一步抽象这一点,并使用授权方案来控制某些组件的特权,并将它们分配给业务角色,而这些角色又被授予用户。
这为你的“多种类型的人”服务。
“记录存在”检查
从早期开始,我就在AskTom学到了一些关于检查行是否存在的知识,这似乎在所有版本中都能很好地支持。
declare
ln_exists pls_integer;
begin
select count(*)
into ln_exists
from dual
where exists (
select null
from your_table -- whatever you're looking for
where id = p_id
);
return ln_exists = 1; -- true if exists
end;Oracle知道如何在解决这个问题上花费最少的精力。
许多其他变体只是从数据库中选择了太多行。
共享应用程序
实际上,您可以使用对同一应用程序的不同身份验证来定义多个入口点。http://www.grassroots-oracle.com/2014/04/shared-authentication-across-multiple-apex-apps.html
发布于 2018-05-28 14:31:02
With valid_student as (
select count(*) as student_result
from student
where upper (p_username) = upper(student_id)
And upper(p_password) = upper(student_password)
),
valid_Admin as (
select count(*) as admin_result
from admin
where upper (p_username) = upper(admin_id)
And upper(p_password) = upper(admin_password)
),
valid_org as (
select count(*) as org_result
from organisation
where upper (p_username) = upper(org_id)
And upper(p_password) = upper(org_password)
)
Select “Valid” as access_allowed
From valid_student s, valid_admin a, valid_org o
Where s.student_result = 1 or a.admin_result = 1 or o.org_result = 1https://stackoverflow.com/questions/50544986
复制相似问题