Oracle

Oracle 12cR2 - 登錄後異常

  • December 22, 2021

登錄觸發器如下:

create or replace TRIGGER USER3.MY_TRIGGER
AFTER LOGON
ON DATABASE
BEGIN
IF SYS_CONTEXT ('USERENV', 'SESSION_USER') IN ('USER30') THEN
IF SYS_CONTEXT ('USERENV', 'HOST') NOT IN ('HOST1', 'HOST2', 'HOST3', 'HOST4') THEN
INSERT INTO USER3.MY_TABLE (USERNAME, SID, OS_USER, HOST, IP, TERMINAL, DB_NAME, INSTANCE, INSTANCE_NAME, MODULE, SERVER_HOST, SERVICE_NAME, TIMESTAMP) VALUES
     (sys_context('USERENV', 'SESSION_USER'), sys_context('USERENV', 'SID'), sys_context('USERENV', 'OS_USER'), sys_context('USERENV', 'HOST'), sys_context('USERENV', 'IP_ADDRESS'), sys_context('USERENV', 'TERMINAL'),
      sys_context('USERENV', 'DB_NAME'), sys_context('USERENV', 'INSTANCE'), sys_context('USERENV','INSTANCE_NAME'), sys_context('USERENV','MODULE'), sys_context('USERENV','SERVER_HOST'),
      sys_context('USERENV','SERVICE_NAME'), SYSTIMESTAMP);
      COMMIT;
RAISE_APPLICATION_ERROR(-20000, 'Denied!  You are not allowed to logon.');
END IF;
END IF;
END;

在不以任何方式乾擾現有結構的情況下,如果它來自 HOST2,我只想對其自己的對象 (USER30) 定義只讀(選擇)權限。你能幫忙解決這個問題嗎?

最好的祝福,

如果它來自 HOST2,我想只對它自己的對象(USER30)定義只讀(選擇)權限。

這不是 MySQL。

不能根據使用者連接的位置授予使用者不同的權限。

使用者將始終對其自己的架構具有更改權限。

沒有辦法解決這個問題。

這就是為什麼任何重要的數據都應該存在於自己的模式中

$$ s $$,它可以與其他想要使用它的人適當地隔離。

權限應由特權授予。

預設情況下,每個使用者都可以讀取和寫入自己的對象。我認為沒有一種簡單的方法可以防止這種情況發生。解決方案將是您唯一的另一個使用者帳戶GRANT SELECT ON USER30.table_name TO USER30_RO)。不幸的是,Oracle 中沒有涵蓋模式中所有表/視圖的特權。權限SELECT ANY TABLE允許訪問所有模式中的所有表,這不是您想要的。

使用SYS_CONTEXT('USERENV', 'HOST')不安全。根據驅動程序,使用者可以自行將此屬性設置為自由文本。

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