如何触发用户连接到数据库的触发器,检查用户系统是否已连接。是正确的?然后错误消息和用户没有连接到数据库。
谢谢你们。
答案 0 :(得分:1)
首先,我想指出,这听起来像是在尝试重新创建命令ALTER SYSTEM ENABLE RESTRICTED SESSION
的功能。你可以考虑改用它。
关于你的问题,有一个简单的答案,但它不是很好。
CREATE OR REPLACE TRIGGER logon_system_maintenance
AFTER LOGON on DATABASE
IS
system_is_connected varchar2(1) := 'N';
BEGIN
select 'Y' into system_is_connected
from v$session
where username = 'SYSTEM' and status = 'ACTIVE';
-- this will not prevent users with ADMINISTER DATABASE TRIGGER privilege from connecting
RAISE_APPLICATION_ERROR (-20001, 'SYSTEM user is performing maintenance, please try again later');
EXCEPTION
WHEN NO_DATA_FOUND THEN
null; -- system not connected, OK
WHEN OTHERS THEN
null; -- probably the user doesn't have permission to view V$SESSION!
-- should they be able to connect, or not?
END;
/
这里的问题是,为了检查SYSTEM是否已连接,用户连接必须能够查看V $ SESSION视图,这意味着他们需要SELECT_CATALOG_ROLE
角色。可能大多数用户没有此角色,这意味着他们甚至无权检查SYSTEM是否已连接!
根据我的经验,大多数应用程序所做的是创建一个表来保存各种系统参数(例如MY_PARAM_TABLE
),并添加一个控制用户是否可以登录的参数(例如SYSTEM_MAINTENANCE = 'N'
) 。然后,当您以SYSTEM身份登录时,将该标志设置为Y,并且触发器会检查该表(所有用户都应该能够访问)并拒绝访问,直到您将其设置回N.
另请注意,您无法阻止DBA用户以这种方式登录。