Oracle

為什麼此登錄觸發器在一台伺服器上起作用,而在另一台伺服器上不起作用?

  • October 6, 2017

我在兩個不同的 Oracle 11g 伺服器上以相同的方式在 SYS 模式中創建了以下觸發器,沒有任何錯誤。

CREATE OR REPLACE TRIGGER LOGON_TRG AFTER LOGON ON DATABASE BEGIN if (user in ('mytestro', 'mytestrw')) then EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = mytest'; end if; exception when others then null; -- prevent a login failure due to an exception END logon_trg; /

在一台伺服器上,我可以說它正在工作,因為我可以在使用任一帳戶登錄後立即選擇 mytest 中的任何表。在另一台伺服器上,它說該表不存在 (ORA-00942)。如果我手動發出ALTER SESSION SET CURRENT_SCHEMA = mytest;,我可以訪問表,所以觸發器似乎沒有觸發。

假設您的觸發器已啟用,我對您的觸發器工作感到驚訝。

預設情況下,使用者名不區分大小寫,並且在內部被視為大寫字元串。如果您創建一個名為mytestroor的使用者mytestrw,則實際使用者名將是MYTESTROand MYTESTRW。通常,像您if聲明中的條件這樣的條件將是錯誤的。

當然,可以創建區分大小寫的小寫使用者名,但這種情況很少見,我認為這是不好的做法,因為它沒有任何好處,只會讓管理變得麻煩。

代替:

create user mytestro ...

您可以使用:

create user "mytestro" ...

前者創建一個名為 的使用者MYTESTRO。後者創建一個使用者mytestro。這些並不相同。

第一個行為如下:

SQL> show user
USER is "MYTESTRO"

而第二個表現為:

SQL> show user
USER is "mytestro"

您可以在登錄時使用上述內容檢查實際使用者名(或者select user from dual如果您的客戶端不支持show)。目前形式的觸發器不適用於上面的第一個使用者,但適用於上面的第二個使用者。

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