【问题标题】:How to remove a oracle user in a shell script如何在 shell 脚本中删除 oracle 用户
【发布时间】:2015-02-06 07:01:06
【问题描述】:

我有一个要求,我需要删除一个 oracle 用户,这应该在 shell 脚本中完成。我是 sql 和 shell 脚本的新手。我正在使用下面的脚本,但无法删除用户。可以谁来帮帮我

#!/bin/sh
su - oracle;
sqlplus as / sysdba;
startup force;
drop user SM cascade;

【问题讨论】:

  • sqlplus as /sysdba; 错误。应该是sqlplus / as sysdba
  • 嗨 Kumar,谢谢,我试过了,但仍然无法删除用户
  • 将响应重定向到日志文件中,并在此处显示内容。
  • SQL*Plus:2015 年 2 月 6 日星期五 17:48:08 发布 11.2.0.3.0 生产版 版权所有 (c) 1982, 2011, Oracle。版权所有。错误:ORA-01031:权限不足输入用户名:
  • 看错误还不够清楚吗?你甚至无法连接到数据库。

标签: sql oracle shell unix


【解决方案1】:

您正在 shell 中运行一系列命令,但它们没有连接。您的 su 以 Oracle 用户身份启动一个新的 shell,但随后退出并且您的脚本以原始用户身份继续运行。然后,您尝试以该原始用户身份运行 SQL*Plus,并且(使用更正的命令)该操作系统用户无权以 SYSDBA 身份连接 - 这是受保护的。并且启动/删除命令在 SQL*Plus 退出之前不会运行,此时它们也只是(无效的)shell 命令。

从概念上讲,您想要更像这样的东西;将 SQL*Plus 作为 su command 而不是 shell 运行,并使用 'heredoc' 提供 SQL 命令:

#/bin/sh
su - oracle -c sqlplus -s -l / as sysdba << !EOF
drop user SM cascade;
exit;
!EOF

那里的启动命令似乎很不合适,所以我把它省略了,但你可以在 !EOF 标记 heredoc 结束之前运行任何你喜欢的命令。

但是根据您的环境,将su 与heredoc 混合可能不起作用(“标准输入必须是tty”?)。您可以将除 su - oracle -c 之外的所有内容放在脚本中:

#!/bin/sh
sqlplus -s -l / as sysdba <<!EOF
drop user SM cascade;
exit;
!EOF

并使用su - oracle -c "&lt;path to your script&gt;"从命令行调用那个,但是您的脚本需要对Oracle帐户可见和可执行。

放置一个会丢弃用户的脚本,尤其是级联,似乎相当危险;很容易在某个时候意外运行它,也许是几年后,也许会抹去很多重要的数据。我想这只是一个示例,但它看起来根本不像你要编写脚本的东西,特别是对于普通用户来说,他们可以随时运行。

【讨论】:

  • 另外,为什么要在这个脚本中强制启动?这是一个不受支持的命令,通常使用不明智;它向数据库发出关闭中止。你为什么要这样做?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 2014-06-27
  • 1970-01-01
相关资源
最近更新 更多