Oracle
數據庫登錄觸發器
為了阻止 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 觸發器斷開連接。
- 觸發器的所有者是登錄的使用者。
- 使用者有權限管理數據庫觸發器