在没有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(用户模式)下崩溃或挂起的情况? [关闭]

在没有管理员权限的情况下更改 Windows 10 中的 Java_Home 路径

在不知道架构名称的情况下向组角色添加权限

在SQL Server 里,登录名,用户,角色,权限,有什么联系?