在没有DBA权限的情况下更改不同数据库下多个模式的密码?
Posted
技术标签:
【中文标题】在没有DBA权限的情况下更改不同数据库下多个模式的密码?【英文标题】:Change passwords of many schemas under different databases without DBA privileges? 【发布时间】:2014-01-04 16:32:03 【问题描述】:我们在不同的数据库下有许多模式。我没有 DBA 权限。我确实有权登录模式和更改密码。我们会在六个月内更改密码。目前,这是一个手动且耗时的过程。即登录到数据库下的每个模式并使用“密码”命令更改密码。当我更改密码时,我有两个文件 - 当前密码和新密码。
我登录到每个 schema@database 并发出以下命令 –
alter user schema_name identified by new_password replace old_password;
记住我没有 DBA 权限;我只能使用用户名和密码登录到架构。
我考虑过创建 shell 脚本并使用 shell 脚本中的“expect”。虽然首先试图找出是否有更简单的方法。我想知道是否有从 SQL*Plus 或 PL/SQL 执行此操作的简单方法?
【问题讨论】:
让具有 DBA 权限的人执行此任务或授予您必要的权限。这是他们的工作,强迫其他人在没有必要特权的情况下这样做是荒谬的。是的,你可以用代码做一些事情,脚本语言可能比 PL/SQL 更简单,但是当有一个更简单的解决方案时,你为什么要付出所有努力呢? 您可以使用命令sqlplus schema/password@database
。在 SQLplus 中,您可以使用 conn schema/password@database
。也许这会有所帮助。
感谢 Wernfried。 DBA 表示,更改密码是各个模式所有者的责任。我确实有权更改可以登录的模式的密码。我必须使用“由 new_password 识别的更改用户 schema_name 替换 old_password;”命令。这很耗时,因为我必须为 60 多个模式执行此操作,并且每一行都放置适当的旧密码和新密码。此外,每个模式的密码也不同,因此它变得非常劳动密集型工作,并且必须对旧/新密码进行大量剪切和粘贴。
【参考方案1】:
使用 PLSQL 或 SQL*Plus 似乎不可能做到这一点,因为同时使用它们,您只能从单个模式执行,并且由于没有 DBA 特权,您不能对所有模式都这样做,而是最终会登录到每个架构后运行脚本。
您可以编写一个读取这两个文件的 shell 脚本,并且对于每一行,它将以下数据插入到第三个文件中,
sqlplus -s username_1/old_password_1@oracle_instance <<EOF
alter user username_1 identified by new_password1 replace old_password_1;
exit
EOF
sqlplus -s username_2/old_password_2@oracle_instance <<EOF
alter user username_2 identified by new_password_2 replace old_password_2;
exit
EOF
.
.
.
sqlplus -s username_n/old_password_n@oracle_instance <<EOF
alter user username_n identified by new_password_n replace old_password_n;
exit
EOF
等等
第三个文件创建后,设置权限为_rwxrwxrwx后执行
【讨论】:
你可以留在一个会话中——也许从sqlplus /nolog
开始——然后为每个模式发出一个connect
,然后是它的alter
。效果相同,但可能比启动可执行文件 60 次要快一些。【参考方案2】:
您需要编写此脚本。
输入:tnsalias 列表,(schema_name,旧密码,新密码)列表。
这是我在多个数据库上更改帐户时使用的脚本。
$ cat alterpassword.py
"""Update oracle database passwords for user by typing the old and new password once.
"""
import cx_Oracle
import getpass
username = 'bjarte'
connect_strings = ['DB1.SUPERSITE.COM',
'DB2.SUPERSITE.COM',
'DB3.SUPERSITE.COM',
'DB4.SUPERSITE.COM',
'DB5.SUPERSITE.COM',
'DB6.SUPERSITE.COM']
def alter_password(username, old_password, new_password, tnsalias):
connect_string = "%s/%s@%s" % (username, old_password, tnsalias)
try:
connection = cx_Oracle.connect(connect_string)
try:
cursor = connection.cursor()
statement = "alter user %s identified by %s" % (username, new_password)
cursor.execute(statement)
return True
except:
return False
else:
cursor.close()
except:
return False
else:
connection.close()
if __name__ == '__main__':
print "Type in old password"
old_password = getpass.getpass()
print "Type in new password"
new_password = getpass.getpass()
for tnsalias in connect_strings:
success = alter_password(username, old_password, new_password, tnsalias)
if success:
print "password altered for user %s in database %s" % (username, tnsalias)
else:
print "password alternation failed for user %s in database %s" % (username, tnsalias)
您可以调整此脚本以从文件中读取输入并用您最喜欢的脚本语言(bash、php、Perl、python、ruby 或 Powershell)重写它。
旁注:架构帐户不是应用程序登录帐户
架构帐户应始终被锁定(无需更改密码)。 当您请求对特定模式进行 ddl 更改时,DBA 可以打开并给您一个密码。完成后,再次锁定架构帐户。
架构帐户是特殊的。他们拥有对象并且可以像 ddl 一样:"drop objecttype objectname"
。您很可能不希望您的应用程序拥有这些强大的权限。
【讨论】:
以上是关于在没有DBA权限的情况下更改不同数据库下多个模式的密码?的主要内容,如果未能解决你的问题,请参考以下文章
在oracle RAC 环境下用 PL/SQL Developer debug procedure 出现 hang 的情况
在没有 Root 访问权限的情况下,Linux 可以在 CPL3(用户模式)下崩溃或挂起的情况? [关闭]