我有这个登录触发器,只允许某些用户登录到 Oracle 数据库(即使他们有正确的密码进入数据库):
CREATE OR REPLACE TRIGGER SYS.LOGON_TRIGGER
AFTER LOGON ON DATABASE
DECLARE
THIS_USER VARCHAR2(50);
BEGIN
SELECT OSUSER INTO THIS_USER FROM V$SESSION WHERE SID = SYS_CONTEXT('USERENV','SID');
IF THIS_USER NOT IN (<List of Users>)
THEN RAISE LOGIN_DENIED;
ENDIF;
END;
/
Run Code Online (Sandbox Code Playgroud)
它用于阻止用户输入大多数模式,但不是所有模式(例如,无论用户如何,仍然可以输入SYS或SYSTEM模式 - 此登录触发器似乎已被完全绕过)。
即使对于这些SYS类型的模式,有没有办法锁定这些用户?
一些上下文:
由于在我参与此之前做出的决定,该数据库的所有登录名都具有相同的密码。此外,大多数用户使用与我们许多自动读/写此数据库的进程相同的登录名。
我们不想简单地更改密码,因为要查看更改这些密码对系统实际产生的影响将是一项非常大的工作。(我们将不得不修改进程用来访问数据库的代码,并且有很多这样的代码。)对我们来说,一个更简单的解决方案是,如果可能的话,仅根据用户名进行锁定。
您的触发器对 SYS 或 SYSTEM 等用户不起作用的原因是因为他们具有ADMINISTER DATABASE TRIGGER特权。
ADMINISTER DATABASE TRIGGER 权限允许您创建数据库级触发器(服务器错误、登录和注销触发器)。它还允许您登录而不考虑登录触发器作为故障安全引发的错误。
因此,答案是:不,您不能阻止此类用户登录 - 至少不能使用登录触发器。
| 归档时间: |
|
| 查看次数: |
339 次 |
| 最近记录: |