我在两个不同的 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
陈述中的条件那样的条件是错误的。当然,可以创建区分大小写的小写用户名,但这种情况很少见,我认为这是不好的做法,因为它没有任何好处,只会让管理变得麻烦。
代替:
您可以使用:
前者创建一个名为 的用户
MYTESTRO
。后者创建一个用户mytestro
。这些并不相同。第一个行为如下:
而第二个行为如下:
您可以使用上面的方法在登录时检查实际的用户名(或者
select user from dual
如果您的客户端不支持show
)。当前形式的触发器不适用于上面的第一个用户,但适用于上面的第二个用户。