【问题标题】:Why lowercase user name need to be in double quote while connecting Oracle?为什么连接Oracle时小写用户名需要用双引号引起来?
【发布时间】:2017-06-29 09:03:08
【问题描述】:

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

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

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

【问题讨论】:

  • 您能否提供用于创建用户的 DDL 命令(以及您用于运行该命令的 UI)以及如何通过每个 UI 进行连接的示例。

标签: oracle sqlplus toad


【解决方案1】:

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,因此我无法评论它如何格式化连接命令,但从您的描述中可以看出它没有将用户名包含在双引号中,因此您需要自己执行此操作以匹配确切的案例存储在数据库中。

【讨论】:

    【解决方案2】:

    默认情况下,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 将所有未加引号的对象标识符转换为大写,所有(双)加引号的标识符将保持其大小写不变,这将是存储在区分大小写的数据字典中。如果您先执行CREATE USER cat IDENTIFIED BY hat,然后尝试执行CREATE USER "CAT" IDENTIFIED BY hat,它会以ORA-01920: user name 'CAT' conflicts with another user or role name 失败,但CREATE USER "cat" IDENTIFIED BY hat 会起作用,您将有两个用户CATcat 使用不同的情况。
    • select * from user_tab_columns where table_name = '"t42"' and column_name = '"col1"'; 应该是 select * from user_tab_columns where table_name = 't42' and column_name = 'col1';,因为数据字典不存储标识符周围的双引号。
    猜你喜欢
    • 2021-06-06
    • 2014-04-27
    • 1970-01-01
    • 2016-06-15
    • 2019-08-13
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多