為什麼此登錄觸發器在一台伺服器上起作用,而在另一台伺服器上不起作用?
我在兩個不同的 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;
,我可以訪問表,所以觸發器似乎沒有觸發。
假設您的觸發器已啟用,我對您的觸發器工作感到驚訝。
預設情況下,使用者名不區分大小寫,並且在內部被視為大寫字元串。如果您創建一個名為
mytestro
or的使用者mytestrw
,則實際使用者名將是MYTESTRO
andMYTESTRW
。通常,像您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
)。目前形式的觸發器不適用於上面的第一個使用者,但適用於上面的第二個使用者。