Criei o trigger abaixo da mesma forma no esquema SYS em dois servidores Oracle 11g diferentes, sem nenhum erro.
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;
/
Em um servidor, posso dizer que está funcionando, pois posso selecionar qualquer mesa no mytest assim que fizer logon com qualquer conta. No outro servidor diz que a tabela não existe (ORA-00942). Se eu emitir ALTER SESSION SET CURRENT_SCHEMA = mytest;
manualmente posso acessar a tabela, então parece que o gatilho não está disparando.
Supondo que seu gatilho esteja ativado, estou surpreso com o fato de seu gatilho funcionar.
Os nomes de usuário não diferenciam maiúsculas de minúsculas por padrão e são tratados como strings em maiúsculas internamente. Se você criar um usuário chamado
mytestro
oumytestrw
, os nomes de usuário reais serãoMYTESTRO
eMYTESTRW
. Normalmente, uma condição como a da suaif
declaração será falsa.Claro, é possível criar nomes de usuário com letras minúsculas e sensíveis a maiúsculas, mas isso é bastante raro e considero uma prática ruim, porque não traz benefícios, apenas dificulta a administração.
Ao invés de:
Você pode usar:
O primeiro cria um usuário chamado
MYTESTRO
. Este último cria um usuáriomytestro
. Estes não são idênticos.O primeiro se comporta como:
Enquanto o segundo se comporta como:
Você pode usar o acima para verificar os nomes de usuário reais quando estiver conectado (ou
select user from dual
se seu cliente não suportarshow
). Seu gatilho em sua forma atual não funciona com o primeiro usuário acima e funciona com o segundo usuário acima.