触发Oracle连接数据库

时间:2018-05-21 12:23:49

标签: sql oracle triggers

如何触发用户连接到数据库的触发器,检查用户系统是否已连接。是正确的?然后错误消息和用户没有连接到数据库。

谢谢你们。

1 个答案:

答案 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用户以这种方式登录。