我正在尝试基于此语句在oracle中解决存储过程... oracle数据库的访问控制在哪里
a)允许每个用户在一天的特定时限内访问系统 . 例如,允许user1从上午8点到下午4点访问系统,而允许user2从下午3点到晚上11点访问系统 .
b)对于每个用户,帐户将在三次登录失败时被锁定 .
c)对于每个用户,空闲会话将在10分钟后终止 .
d)允许高权限用户同时拥有最多两个并发会话,而允许其他用户只有一个并发会话 .
我设法使用 Profiles 回答b,c,d问题 . 然后我将用户更改为配置文件 . 存储过程不断给我编译错误 . 提前感谢这是我的工作
create role roleUser;
grant create session to roleUser;
grant select on staff_data to roleUser;
create user user1 identified by abc123;
create user user2 identified by abc123;
--common user privilege
create profile userProfile limit
FAILED_LOGIN_ATTEMPTS 3
IDLE_TIME 10
SESSIONS_PER_USER 1
--high user privilege
create profile userHighProfile limit
FAILED_LOGIN_ATTEMPTS 3
IDLE_TIME 10
SESSIONS_PER_USER 2
alter user user1 profile userProfile;
alter user user2 profile userHighProfile;
grant roleUser to user1,user2;
show error;
create or replace trigger limit_logon
after logon on database
begin
if to_char(sysdate,'HH24') between 8 and 16 then
set roleUser to user1;
elsif to_char(sysdate,'HH24') between 15 and 23 then
set roleUser to user2;
else
revoke roleUser from user1;
revoke roleUser from user2;
end if;
end;
3 回答
我可以想象你有一个包含用户在其中被允许登录时间范围的表,当你登录触发器在用户登录会核对用户的范围(一个或多个)当前时间 . 创建一个过程或函数来封装逻辑,如果当时不允许用户登录则让它引发错误 .
当然,这不会在窗口结束时将用户注销 .
我有一种感觉,你还需要在这里是一个定期运行检查所有会话一个DBMS_SCHEDULER工作,允许用户在那个时候进行登录,从而使用户的,如果他们保持过去的窗口登录会话可以被杀死 .
set roleUser to user1;
必须execute immediate 'grant roleUser to user1';
revoke roleUser from user1;
必须execute immediate 'revoke roleUser from user1';
然而,由于需要的,因为GRANT / REVOKE的角色是执行 after 登录,这样就不会影响当前会话将无法正常工作,用户首先必须注销并重新登录 .
您可以启用和禁用授予的角色,而不是授予和撤消角色,这会立即生效,请参阅SET ROLE .
无论如何,为了您的目的,最简单的解决方案应该是这个:
您可以使用连接到Axiomatics数据访问过滤器的Oracle虚拟专用数据库(免责声明 - 我为Axiomatics工作) . 在数据访问过滤器中,您可以定义基于时间的访问控制策略,还包括其他参数,例如用户或数据属性 .
这是最干净,最可持续的方式 .