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

时间:2017-06-29 09:03:09

标签: oracle sqlplus toad

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

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

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

2 个答案:

答案 0 :(得分:0)

默认情况下,Oracle数据字典使用UPPER CASE作为对象名称。考虑这样的陈述:

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

连接

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

create user "cat" identified by "hat"

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

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

答案 1 :(得分:0)

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

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

  

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

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