【问题标题】:SQLAlchemy read-only Oracle connectionSQLAlchemy 只读 Oracle 连接
【发布时间】:2021-11-16 19:21:51
【问题描述】:

这个问题类似于Oracle read-only JDBC connection,但使用的是 SQLAlchemy 而不是 JDBC

我正在尝试在只读模式下使用 SQLAlchemy 设置与 Oracle 的连接。原因是我想确保在使用 SQLAlchemy 时不会无意更改任何内容,而数据库中的数据可以被其他程序修改。

其他用户建议创建一个新用户并授予他们选择权限,以便允许它从现有表中读取。尽管在许多情况下这可能是一种有效的方法,但我的问题的目的是从 SQLAlchemy 中执行此操作,而不更改数据库中的任何内容。

有没有办法在 SQLAlchemy 中为 READONLY 中的 create_engine()connect() 函数设置连接参数?如果有,是怎么做的?

【问题讨论】:

  • 我认为,如果你在 oracle DB 中创建一个用户并给予用户特定的授权,它会给你你所需要的,这种解决方案对你来说可以接受吗?
  • sqlalchemy 将使用您提供的凭据连接到数据库。如果允许此类凭据创建或修改事物,他们将能够做到。您必须使用没有任何写入权限的数据库用户的凭据
  • @AliFidanli 是的,在可以创建新用户的情况下,最好的方法是使用“授予选择”来创建我想要读取的表。该问题的目的是尽量减少对现有数据库的干扰,避免添加/触摸/编辑任何内容。
  • @RobertoHernandez 请查看我对 Ali Fidanli 评论的回答。
  • @aturegano,你使用了错误的方法来解决这个问题。您并没有在数据库中侵入性地做任何事情,恰恰相反。您正在避免将来出现问题。如果您授予 db 用户特权,那么您在sqlalchemy 中所做的一切都无关紧要,任何人都可以执行该 db 用户被允许做的任何事情。从架构的角度来看,您正试图在错误的层中应用安全性。

标签: python oracle sqlalchemy


【解决方案1】:

正如我们在 cmets 中所讨论的,这里有一个创建受限只读用户的简单方法:

  1. 创建用户并授予会话授权

CREATE USER app_user IDENTIFIED BY app_user DEFAULT TABLESPACE users TEMPORARY TABLESPACE temp;

GRANT CREATE SESSION to app_user
  1. 创建角色以仅授予选择权限。下一步

CREATE ROLE ro_role;
  1. 为所需架构中的表授予选择授权

BEGIN
  FOR x IN (SELECT * FROM dba_tables WHERE owner='SCHEMA_NAME')
  LOOP
    EXECUTE IMMEDIATE 'GRANT SELECT ON schema_name.' || x.table_name || 
                                  ' TO ro_role';
  END LOOP;
END;
  1. 使用我们创建的角色授予用户权限

GRANT ro_role TO app_user;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-24
    • 2017-10-23
    • 2016-07-27
    • 2017-02-21
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多