Oracle

數據庫登錄觸發器

  • January 10, 2012

為了阻止 Oracle 數據庫上的特定使用者和 IP 組合,我創建了以下觸發器,並且編譯沒有錯誤。

Create or replace trigger you_may_not_login
after logon on database
begin
if sys_context('USERENV','SESSION_USER')='xx' AND     sys_context('USERENV','IP_ADDRESS')='10.0.30.219' then
raise_application_error(-20001,'Denied!  You are not allowed to logon the database');
end if;
end;
/

當我使用“xx”使用者登錄時,警報日誌顯示以下錯誤,但已授予數據庫訪問權限,觸發器以某種方式無法阻止使用者登錄。

Errors in file /oraarch/core/udump/wfsbi_ora_9338.trc:
ORA-00604: error occurred at recursive SQL level 1
ORA-20001: Sorry, you are not allowed here!
ORA-06512: at line 9

我哪裡錯了?/

您可能想在 SQLPlus 中驗證這一點。如果它仍然沒有斷開您的連接,則在觸發器完成後執行以下命令來驗證您的假設:

SELECT 'Check This' FROM dual WHERE sys_context('USERENV','SESSION_USER') = 'xx';

SELECT 'Check This' FROM dual WHERE sys_context('USERENV','IP_ADDRESS') <> '10.0.30.219';

SELECT 'Check This' FROM user_role_privs WHERE granted_role='DBA';

SELECT 'Check This' FROM user_objects WHERE Object_Name='YOU_MAY_NOT_LOGIN' AND Object_Type='TRIGGER';

SELECT 'Check This' FROM User_sys_Privs WHERE Privilege='ADMINISTER DATABASE TRIGGER';

如果其中任何一個返回Check This,那麼您的假設之一是不正確的。

對我來說,斷開連接所需的只是RAISE_APPLICATION_ERROR,但另一個站點也使用EXECUTE IMMEDIATE 'DISCONNECT';。即使已授予 DBA 角色,這可能也允許它工作。我沒有測試過就知道了。

您還應該知道,這不應該用於安全性來代替安全密碼和其他措施,因為客戶端發送的 IP_ADDRESS 可以更改。

這個答案到 ServerFault 上的類似問題:

觸發器不會拒絕訪問,如果

  • DBA 組的成員不能通過 ON LOGON 觸發器斷開連接。
  • 觸發器的所有者是登錄的使用者。
  • 使用者有權限管理數據庫觸發器

引用自:https://dba.stackexchange.com/questions/10444