我希望这不是一个愚蠢的问题:
我继承了许多Oracle存储过程,触发器......其中一个触发器编写如下:
create or replace trigger TRN_NIS_LOGON after logon on database
begin
execute immediate 'ALTER SESSION SET NLS_SORT=BINARY_CI';
execute immediate 'ALTER SESSION SET NLS_COMP=LINGUISTIC';
end;
/
这引起了问题。所以,我读了http://docs.oracle.com/cd/B19306_01/server.102/b14225/ch5lingsort.htm
然后,有人告诉我,我应该改变触发器:
create or replace trigger TRN_NIS_LOGON after logon on database
begin
execute immediate 'ALTER SESSION SET NLS_SORT=BINARY_CI';
execute immediate 'ALTER SESSION SET NLS_COMP=BINARY';
end;
/
但是,我觉得这没有道理。在我看来,NLS_SORT = BINARY_CI / AI需要与NLS_COMP = LINGUISTIC和相应的语言索引相结合。目标是让oracle表现得像SQL服务器(我还浏览了这个:https://hoopercharles.wordpress.com/2010/06/04/sql-experimenting-with-case-insensitive-searches/)。
看起来上面的触发器是一个非常糟糕的主意,并且在处理具有语言索引的表时,NLS_COMP和NLS_SORT必须一起设置为会话。不应该使用这样的触发器。没有语言索引的NLS_SORT = BINARY_CI将导致全表扫描。这是对的吗?