在没有DBA权限的情况下更改不同数据库下的许多模式的密码?

时间:2014-01-04 16:32:04

标签: oracle plsql sqlplus

我们在不同的数据库下有很多模式。我没有DBA权限。我有权登录模式和更改密码。我们在六个月内更改密码。目前,这是一个手动且耗时的过程。即登录到database / s下的每个模式,并使用“password”命令更改密码。当我更改密码时,我有两个文件 - 当前密码和新密码。

我登录到每个架构@数据库并发出以下命令 -

alter user schema_name  identified by new_password  replace  old_password;

请记住,我没有DBA权限;我只能使用用户名和密码登录模式。

我考虑过创建shell脚本并使用shell脚本中的“expect”。虽然首先试图找出是否有更简单的方法。我想知道有没有一种简单的方法可以从SQL * Plus或PL / SQL中执行此操作?

2 个答案:

答案 0 :(得分:4)

使用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后执行

答案 1 :(得分:1)

你需要编写脚本。

输入: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"。您很可能不希望您的应用程序具有这些强大的权限。