【问题标题】:Sqlplus command to change oracle database password in kornshell sciptsqlplus 命令在 korn shell 脚本中更改 oracle 数据库密码
【发布时间】:2018-07-09 14:51:57
【问题描述】:

我正在编写一个脚本来更改 Oracle 数据库的密码。我成功地获得了数据库名称、user_id、旧密码和新密码。我有这个命令可以更改旧密码并将其设置为新密码:

sqlplus -s /nolog << EOF 
connect ${USER_ID}/"${OLD_PASS}"@${DB_NAME} 
alter user ${USER_ID} identified by ${NEW_PASS} replace ${OLD_PASS};
/
exit
EOF

当我将结果存储到变量中并打印出变量时,我收到一条错误消息:

ORA-00922:缺少或无效选项。

我相信这与 alter user 命令有关。如何修复此命令,以便通过我的脚本成功更改密码?

【问题讨论】:

  • 没有看到你如何设置变量,以及它们的实际值是什么,我们只能猜测你做错了什么。
  • 变量已经过测试并包含用户的适当凭据,并且 DB_NAME 也包含正确的数据库
  • 除了 Alex 所说的引用变量之外,您不应该在 alter 语句之后使用 /。这将导致重新运行相同的语句,这将失败,因为现在您的旧密码不一样了。

标签: oracle shell sqlplus


【解决方案1】:

由于您在connect 字符串中将旧密码用双引号括起来,因此旧密码和新密码似乎都可能包含特殊字符。您收到的错误与带有感叹号的密码一致;但也可以以数字开头,包含多字节字符等。

From the documentaton:

以下密码必须用双引号括起来:

  • 包含多字节字符的密码。
  • 以数字或特殊字符开头并包含字母字符的密码。例如:

    "123abc"
    "#abc"
    "123dc$"  
    
  • 包含除字母字符、数字和特殊字符之外的任何字符的密码。例如:

    "abc>"
    "abc@",
    " "
    

所以,也将它们包含在alter user 中:

alter user ${USER_ID} identified by "${NEW_PASS}" replace "${OLD_PASS}";

【讨论】:

  • 谢谢,这是我的问题的一部分。现在,当我运行我的脚本时,我得到:错误:ORA-00972:标识符太长。我想这意味着我的新密码太长了?
  • 可能,如果新密码超过 30 个字符。错误信息应该指向问题的行和字符位置;可能是"${NEW_PASS}" 中的第一个双引号。 (如果旧的那么长,connect 将首先失败。)同样,如果您在问题中包含样本 - 代表 - 值,我们就不需要推测了。但是:"Passwords can be at most 30 bytes long."。请注意,这是 bytes,而不是 chars
  • 感谢您的帮助。事实证明,如果我的新密码包含特殊字符,我会收到错误消息,但是使新密码相对简单可以让脚本正常工作
  • 我认为在密码中唯一不起作用的是双引号字符,但通过 shell 脚本,我可以想象你可能会遇到反斜杠问题,具体取决于它的位置是,或一个&符号(您可以为此设置定义),并且可能是一个美元符号,尽管可能不是。尽管我认为,引号内的其他任何内容都应该没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 2014-02-11
  • 2019-03-09
  • 2017-09-02
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多