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:无效的参数个数ORA-06550:第6行,第1列:PL / SQL:忽略SQL语句
答案 0 :(得分:6)
我想尝试分解它,然后解决问题。有很多事情要解决。
你如何控制整个桌子的独特性?学生和管理中可能都有ALBERT。它甚至可能是该设施的同一个人,学生和雇员。我是这样的人。
您的表之间没有连接,这会将结果转换为cartesion产品,并且我非常确定您可以使用NIKOLA的密码返回ALBERT登录。
我认为您可能打算使用集合运算符
select ...
from student
where ...
union all
select ...
from admin
where ...
UNION ALL 表示无需检查唯一性,也不需要extra sort。
能够UPPER密码意味着您将其保存为明文。今天的人们应该继承足够的数字流畅性,使密码不应该存储明文。如初。
有关如何通过散列密码在APEX中设置自定义身份验证的示例,请参阅此文章。在一个令人失望的数字中,这是一个罕见的数字,没有哈希密码。这个也用用户名和一些盐哈希,这是更好的。 http://barrybrierley.blogspot.com.au/2015/05/custom-authentication-in-apex.html
它也开始满足您对用户类型的需求。
我确定APEX文档中有一个示例,但我无法找到它。
确定您拥有有效用户后,您可以确定他们的用户类型,然后使用Authorization Schemes控制他们对各种组件的访问权限。
对于更灵活的系统,我会进一步抽象并使用授权方案来控制特权到某些组件,并将这些组件分配给业务角色授予用户。
这为您的多种类型的人提供服务"。
从早期开始,我在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
答案 1 :(得分:0)
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
答案 2 :(得分:-1)
语法错误。尝试
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)
);