为什么连接Oracle时用户名要小写双引号?

Why lowercase user name need to be in double quote while connecting Oracle?

我试图通过使用 Toad 为 Mac 和 SQLpLus 创建用户。我创建用户并成功授予权限。

如果我对用户名使用小写字母,我注意到在 TOAD 上使用它时必须用双引号将其指定。否则找不到用户。在登录过程中 It returns "ORA-01017: invalid username/password; logon denied".

但是如果我使用SQL plus 创建它,则不需要用双引号指定。有什么想法吗?

默认情况下,Oracle 数据字典对对象名称使用大写。考虑这样的语句:

create table t23 (col1 number);

要找到这些详细信息,我们需要

select * from user_tables where table_name = 'T23';
select * from user_tab_columns where table_name = 'T23' and column_name = 'COL1';

但是如果我们在标识符中使用双引号,数据字典将按原样存储它们:

create table "t42" ("col1" number);

因此此查询将找不到任何内容:

select * from user_tables where table_name = 'T42';

但这将:

select * from user_tab_columns where table_name = 't42' and column_name = 'col1';

我们需要使用双引号来引用标识符:

alter table "t42" modify "col1" varchar2(10);

如果我们创建的对象带有大写标识符或没有双引号,一切都很好。

这很好:

create user cat identified by cat;

这也可以(假设您还没有 运行 之前的声明):

create user "CAT" identified by hat; 

无论哪种情况,我们都可以连接为 conn cat/hat

因此 Mac 的 Toad 似乎将您的对象用双引号引起来。所以如果你使用小写它执行的是

create user "cat" identified by "hat"

在这种情况下,您必须使用双引号并在引用该用户时保持大小写正确:conn "cat"/hatCAT"cat" 是不同的用户。

此行为可能在 TOAD 中是可配置的 - 查看首选项菜单。否则,请注意始终对数据库对象使用大写字母(不要担心密码,它们在 11g 及更高版本中区分大小写。

Oracle 的数据字典区分大小写。 Oracle 将通过将所有未加引号的对象名称转换为大写来从用户那里抽象出这种区分大小写的特性;但是(双)引号对象名称不会进行此转换,并且会在输入时存储在数据字典中。

所以:

CREATE USER "CAT" IDENTIFIED BY hat1;
CREATE USER "cat" IDENTIFIED BY hat2;
CREATE USER "Cat" IDENTIFIED BY hat3;

将创建三个不同的用户 CATcatCat

但是:

CREATE USER cat IDENTIFIED BY hat1;
CREATE USER Cat IDENTIFIED BY hat1;
CREATE USER CAT IDENTIFIED BY hat1;
CREATE USER "CAT" IDENTIFIED BY hat1;

都是等价语句,因为不带引号的用户名将被转换为大写 CAT

如果您想连接到用户,则需要确保用户名的大小写正确 - SQL/Plus 将对未加引号的名称执行相同的转换。

因此,对于上面的示例,您需要使用:

CONNECT cat/hat1
CONNECT "CAT"/hat1
CONNECT "cat"/hat2
CONNECT "Cat"/hat3

注意:不带引号和带引号的大写用户名是相同的。

If I use lowercase for the user name, I noticed that I have to specify it in double quotes while using it over TOAD. Otherwise It can not find the user. On login process It returns "ORA-01017: invalid username/password; logon denied".

我不使用 Toad,所以我无法评论它如何格式化连接命令,但从你的描述中可以看出它没有用双引号将用户名括起来,所以你需要自己做以匹配数据库中存储的确切案例。