Oracle apex Oracle apex身份验证方案登录错误

Oracle apex Oracle apex身份验证方案登录错误,oracle-apex,sql-pl,Oracle Apex,Sql Pl,上面是我制作的身份验证代码,用于从多个表中获取信息并使用它们对登录进行身份验证。如果我只是为学生做,效果很好,但我需要多种类型的用户才能访问该软件,而且我不能同时运行多个身份验证方案 所有表名和列名都正确 下面是我得到的错误 ORA-06550:第9行第7列:PL/SQL:ORA-00909:参数数无效ORA-06550:第6行第1列:PL/SQL:SQL语句被忽略语法错误。试一试 FUNCTION authenticate(p_username IN VARCHAR2,p_password I

上面是我制作的身份验证代码,用于从多个表中获取信息并使用它们对登录进行身份验证。如果我只是为学生做,效果很好,但我需要多种类型的用户才能访问该软件,而且我不能同时运行多个身份验证方案 所有表名和列名都正确 下面是我得到的错误 ORA-06550:第9行第7列:PL/SQL:ORA-00909:参数数无效ORA-06550:第6行第1列:PL/SQL:SQL语句被忽略

语法错误。试一试

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;

我想把这个问题分解一下,把问题解决掉。有许多事情需要解决

逻辑 如何控制表之间的唯一性?在学生和管理方面都可能有一个阿尔伯特。它甚至可能是同一个人,一名学生和该机构的雇员。我就是这样一个人

建议的SQL 您的表之间没有连接,这会将结果转换为cartesion产品,我很确定您可以返回使用NIKOLA密码登录的ALBERT true

我想你可能想用集合运算符

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)
                           );
联合意味着不需要检查唯一性,也不需要一个统一的标准

密码保护 能够设置密码上限意味着您正在以明文形式存储密码。今天的人们应该继承足够的数字流畅性,密码不应以明文存储。永远

有关如何通过散列密码在APEX中设置自定义身份验证的示例,请参阅本文。在一个令人失望的数字中,很少有一个没有散列密码。这一个还与用户名和一些盐,这是更好的哈希。

它还开始满足您关于用户类型的需求

我确信APEX文档中有一个例子,但我找不到

用户类型-授权 一旦建立了有效用户,就可以确定他们是什么类型的用户,然后使用控制他们对各种组件的访问

对于更灵活的系统,我将进一步抽象这一点,并使用授权方案来控制某些组件的权限,并将这些权限分配给业务角色,而业务角色又被授予用户

这服务于你的“多种类型的人”

“记录存在”检查 从很早开始,我就在AskTom学到了一些关于检查行的存在性的知识,这似乎在所有版本中都适用

select ...
from student 
where ...
union all
select ...
from admin
where ...
甲骨文知道如何用最少的努力来解决这个问题

许多其他变体只是从数据库中选择了太多的行

共享应用程序 实际上,您可以使用对同一应用程序的不同身份验证来定义多个入口点。

SQL太可怕了。你显然不是在散列密码;您可以根据另一个人的密码对其进行身份验证;并且有连接,所以这不能很好地扩展。请进一步研究。查看Oracle APEX文档中的自定义身份验证示例。对于任何级别的SQL学员,我都不能认可这是一个合适的答案。这将确保用户名/密码组合经过测试。我更喜欢使用打包函数来处理验证。而且,这读起来好像你的密码是在未加密的状态下传递的!
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;
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 = 1