Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有可能拥有Oracle数据库吗;别名登录";是否使用自己的凭据进行另一次登录?_Oracle_Credentials - Fatal编程技术网

有可能拥有Oracle数据库吗;别名登录";是否使用自己的凭据进行另一次登录?

有可能拥有Oracle数据库吗;别名登录";是否使用自己的凭据进行另一次登录?,oracle,credentials,Oracle,Credentials,我们集团的情况如下: 我们有大量的应用程序访问中央数据库。所有这些应用程序都使用同一个“应用程序”数据库凭据和一个不特别安全的密码,因此我们违反了我们公司完全合法的安全准则。其中一些应用程序在WebLogic上运行,其他应用程序是独立的java应用程序,其他应用程序只是shell脚本,但都使用相同的用户名:密码凭据,这些凭据的编码方式多种多样,但安全性较差:硬编码,在不同安全级别的各种配置文件中编写,等等 这种设置相当陈旧,要改变是一场噩梦。如果我们更改数据库上的密码,不同位置的大量配置文件也需

我们集团的情况如下:

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

这种设置相当陈旧,要改变是一场噩梦。如果我们更改数据库上的密码,不同位置的大量配置文件也需要更改,这需要启动和停止各种服务器、更改配置等。不可避免地会出现无法忍受的停机时间

如果可以创建第二个数据库用户,作为第一个数据库用户的“别名”,在第一个用户的关联架构上具有与第一个用户相同的权限和特权,但使用不同的密码,那么这一配置噩梦将得到缓解。用户可以在数据库上创建,然后,或多或少地在空闲时,每个应用程序都可以重新配置为使用“别名”,而每个应用程序都不会出现非常短暂的中断。然后,当安全规则要求再次更改密码时,同样的过程可以反过来进行

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

我指定“别名”的原因是,第二个登录应该与第一个登录完全相同,也就是说,SQL不需要更改:即
SELECT*from some_table
应该继续工作,而不需要更改
SELECT*from first_user.some_table

很可能这样一个系统已经存在了,它的名字我并不期待,但到目前为止,我的搜索还没有告诉我我在寻找什么

有没有人曾经处理过这种情况,是如何处理的?也许有一种解决方案与我的“别名”想法不同


谢谢。

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

create role universal_app_role identified by 123;
然后,您需要找到所有所需的priviledes并将其授予此角色,例如:

grant create table to universal_app_role;
之后,您可以将此角色授予任何用户:

grant universal_app_role to john_smith;
之后,您还可以向该角色添加任何新权限(
universal\u app\u role
),所有具有该角色的用户都将获得该权限

编辑
你已经更新了你的问题,而我的答案现在变得不太合适了。如果要在不写入架构名称的情况下访问数据库对象,可以为该对象创建公共同义词:

create public synonym some_table for first_user.some_table;

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

create role universal_app_role identified by 123;
然后,您需要找到所有所需的priviledes并将其授予此角色,例如:

grant create table to universal_app_role;
之后,您可以将此角色授予任何用户:

grant universal_app_role to john_smith;
之后,您还可以向该角色添加任何新权限(
universal\u app\u role
),所有具有该角色的用户都将获得该权限

编辑
你已经更新了你的问题,而我的答案现在变得不太合适了。如果要在不写入架构名称的情况下访问数据库对象,可以为该对象创建公共同义词:

create public synonym some_table for first_user.some_table;

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

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

  • 创建一个具有您希望该帐户拥有的所有权限的角色
  • 创建新用户
  • 将新创建的角色授予新创建的用户
  • 切换应用程序以使用新创建的用户
例如,如果您真正想要的是允许新用户对模式中的每个表执行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;
您还可以创建一个登录触发器,该触发器执行以下操作:

ALTER SESSION SET current_schema = foo

当您登录到

时,您所描述的内容听起来像是。您可以使用自己的密码创建用户
a
,但可以作为不同的用户
B
连接到数据库。唯一的缺点是,弄清楚应用程序可能使用的每个框架如何进行代理身份验证可能有点麻烦。充分利用代理身份验证可能需要对某些应用程序进行代码更改

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

  • 创建一个具有您希望该帐户拥有的所有权限的角色
  • 创建新用户
  • 将新创建的角色授予新创建的用户
  • 切换应用程序以使用新创建的用户
例如,如果您真正想要的是允许新用户对模式中的每个表执行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;
您还可以创建一个登录触发器,该触发器执行以下操作:

ALTER SESSION SET current_schema = foo

当您登录到
栏时

@Justin\u谢谢。你的助学金声明中缺少TO条款吗?@SteveCohen-为什么是的,是的,我是。应该是正确的