为什么在连接Oracle时,小写用户名需要用双引号括起来?

为什么在连接Oracle时,小写用户名需要用双引号括起来?,oracle,sqlplus,toad,Oracle,Sqlplus,Toad,我试图通过使用Toad for Mac和SQLpLus创建用户。我成功创建了用户并授予了权限 如果我使用小写作为用户名,我注意到在TOAD上使用它时必须用双引号来指定它。否则它找不到用户。在登录过程中,它返回“ORA-01017:无效用户名/密码;登录被拒绝” 但是,如果我使用SQL plus创建它,就不需要使用双引号来指定。有什么想法吗?默认情况下,Oracle数据字典对对象名称使用大写。考虑这样的陈述: create table t23 (col1 number); 要找到这些细节,我们需

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

如果我使用小写作为用户名,我注意到在TOAD上使用它时必须用双引号来指定它。否则它找不到用户。在登录过程中,它返回“ORA-01017:无效用户名/密码;登录被拒绝”


但是,如果我使用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;
这也可以(假设您尚未运行上一条语句):

在任何一种情况下,我们都可以连接为
conn cat/hat

所以看起来Toad for Mac用双引号将您的对象括起来。所以如果你用小写,它执行的是

create user "cat" identified by "hat"
在这种情况下,您必须使用双引号,并在提及该用户时保持大小写正确:
conn“cat”/hat
CAT
“CAT”
是不同的用户


这种行为在蟾蜍中是可配置的——在“首选项”菜单中浏览一下。否则,请注意始终对数据库对象使用大写字母(不要担心密码,它们在11g及更高版本中区分大小写。

Oracle的数据字典区分大小写。Oracle将通过将所有不带引号的对象名转换为大写字母来从用户处提取此区分大小写的名称;但是(双精度)引用的对象名称将不进行此转换,并且在输入时将存储在数据字典中

因此:

将创建三个不同的用户
CAT
CAT
CAT

然而:

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
注意:不带引号和带引号的大写用户名是相同的

如果我使用小写字母作为用户名,我注意到在TOAD上使用时必须用双引号指定。否则它找不到用户。在登录过程中,它返回“ORA-01017:无效用户名/密码;拒绝登录”


我不使用Toad,因此无法对其如何设置连接命令的格式发表评论,但从您的描述中可以看出,它没有将用户名用双引号括起来,因此您需要自己这样做,以匹配存储在数据库中的确切大小写。

您能给出用于创建用户的DDL命令吗(以及用于运行该命令的用户界面)以及如何通过每个用户界面进行连接的示例。数据字典对对象名称不使用大写-默认情况下,Oracle会将所有不带引号的对象标识符转换为大写和全部(双精度)带引号的标识符将保持其大小写不变,这将存储在区分大小写的数据字典中。如果您执行
创建由hat标识的用户cat
,然后尝试执行
创建用户“cat”由hat标识的
ORA-01920将失败:用户名“CAT”与另一个用户或角色名冲突
,但是
创建由hat标识的用户“CAT”将起作用,并且您将有两个用户
CAT
CAT
,情况不同。
从用户选项卡中选择*,其中表名=“t42”'and column_name='“col1”;
应该是
select*from user_tab_columns,其中table_name='t42'和column_name='col1';
,因为数据字典不在标识符周围存储双引号。
CREATE USER cat IDENTIFIED BY hat1;
CREATE USER Cat IDENTIFIED BY hat1;
CREATE USER CAT IDENTIFIED BY hat1;
CREATE USER "CAT" IDENTIFIED BY hat1;
CONNECT cat/hat1
CONNECT "CAT"/hat1
CONNECT "cat"/hat2
CONNECT "Cat"/hat3