是否可以使用自己的凭据为另一个登录名创建 Oracle 数据库 "alias login"?

Is it possible to have an Oracle Database "alias login" for another login with its own credentials?

我们组有以下情况:

我们有大量访问中央数据库的应用程序。所有这些应用程序都使用相同的 "application" 数据库凭据和一个不是特别安全的密码,因此我们违反了我们公司完全合法的安全准则。其中一些应用程序 运行 在 WebLogic 上,其他应用程序是独立的 java 应用程序,其他只是 shell 脚本,但都使用相同的 username:password 凭据,这些凭据编码为各种不够安全的方式:硬编码、写入不同安全级别的各种配置文件等。

这个设置相当陈旧,更改起来简直就是一场噩梦。如果我们修改数据库的密码,那么大量不同位置的配置文件也需要修改,这需要启动和停止各种服务器,配置更改等。不可避免地会出现无法忍受的长时间中断。

如果可以创建第二个数据库用户,作为第一个数据库用户的"alias",在第一个用户的关联模式上具有与第一个用户相同的权利和特权,但使用不同的密码,这配置噩梦将得到缓解。可以在数据库上创建用户,然后,或多或少地有空,可以将每个应用程序重新配置为使用 "alias",而不会对每个应用程序造成非常短暂的中断。然后,当安全规则规定再次更改密码时,可以反向执行相同的过程。

更新 - 以下段落中的要求不在原始问题中。

我指定 "alias" 的原因是第二次登录应该与第一次登录完全一样,也就是说,不需要更改 SQL:即 SELECT * from some_table 应该无需更改 SELECT * from first_user.some_table.

即可继续工作

很可能这样的系统已经存在,但名称出乎我的意料,但到目前为止我的搜索还没有显示我正在寻找的东西。

有没有人遇到过这种情况,是怎么处理的?也许有一个解决方案与我的 "alias" 想法不同?

谢谢。

您可以使用角色。创建角色:

create role universal_app_role identified by 123;

然后您需要找到所有需要的权限并授予该角色,例如:

grant create table to universal_app_role;

之后您可以将此角色授予任何用户:

grant universal_app_role to john_smith;

之后您还可以为这个角色添加任何新的权限(universal_app_role),所有拥有这个角色的用户都将获得它。

编辑
您已经更新了您的问题,我的回答现在变得不那么合适了。如果您想在不编写模式名称的情况下访问数据库对象,您可以为该对象创建 public 同义词:

create public synonym some_table for first_user.some_table;

听起来你描述的是proxy authentication。您可以使用自己的密码创建用户 A,但能够以不同的用户 B 身份连接到数据库。唯一的缺点是弄清楚应用程序可能使用的每个框架如何进行代理身份验证可能有点痛苦。充分利用代理身份验证可能需要对某些应用程序进行代码更改。

退一步说,我不清楚您是否真的需要那么复杂。除非您的所有应用程序都需要在目标架构中创建和删除对象(这非常不寻常),否则听起来您只想

  • 创建一个具有您希望帐户拥有的所有权限的角色。
  • 创建新用户
  • 将新创建的角色授予新创建的用户
  • 切换应用程序以使用新创建的用户

例如,如果您真正想要的是允许新用户对架构中的每个 table 执行 DML

-- Create the role that will have privileges to do DML on every table in
-- the FOO schema
CREATE ROLE foo_all_dml;

-- Grant privileges to the role
BEGIN
  FOR t IN (SELECT *
              FROM dba_tables
             WHERE owner = 'FOO')
  LOOP
    EXECUTE IMMEDIATE 
      'GRANT SELECT, INSERT, UPDATE, DELETE ON foo.' || 
        t.table_name || 
       ' TO foo_all_dml';
  END LOOP;
END;
/

-- Create the new user
CREATE USER bar 
  IDENTIFIED BY <<new password>>;

-- Grant the role to the user
GRANT foo_all_dml
   TO bar;

随着新对象的添加,您将向该角色授予适当的权限,并且您使用该角色创建的所有用户都将获得该权限。

如果您想避免限定对象名称,您可以创建引用原始模式中对象的同义词(public 或私有)。如果您想在 BAR 模式中为 FOO 模式

中的每个 table 创建私有同义词
BEGIN
  FOR t IN (SELECT *
              FROM dba_tables
             WHERE owner = 'FOO')
  LOOP
    EXECUTE IMMEDIATE 
      'CREATE SYNONYM bar.' || t.table_name ||
        ' FOR foo.' || t.table_name;
  END LOOP;
END;

您还可以创建一个登录触发器来执行

ALTER SESSION SET current_schema = foo

当您登录 bar.