【问题标题】:Postgres (psycopg2) prevent user from changing runtime configuration parametersPostgres (psycopg2) 阻止用户更改运行时配置参数
【发布时间】:2021-01-05 17:09:05
【问题描述】:

我正在尝试建立一个完全只读的连接,以便用户针对我的数据库中的架构运行查询。虽然用户在 my_schema 的表中只有 SELECT 权限,但我仍然可以在游标中运行 SET {param}。它会持续存在,并且使用另一个游标的下一个查询具有新参数。

我尝试使用psycopg2.set_session(readonly=True) 无济于事。我找不到有关使用 psql 终端撤销用户此权限的信息,因此我怀疑它是特定于连接的。但是,我仍然找不到任何有关使用 psycopg2 执行此操作的信息。

import psycopg2

readonly_conn = psycopg2.connect(READONLY_DATABASE_URL)
cur = readonly_conn.cursor()
cur.execute("SET search_path TO my_schema,public")
cur.close()

【问题讨论】:

    标签: python postgresql psycopg2


    【解决方案1】:

    来自docs

    SET 只影响当前会话使用的值。

    一个会话大概相当于一个 TCP 连接,它可以“包含”多个游标。

    【讨论】:

    • 如果你问如何让 postgres 禁止参数的“SET”:dba.stackexchange.com/questions/263955/…
    • 看起来没有办法限制它。在每个事务之后回滚或提交是否有意义?我可能会回滚,因为我不希望 SET 在之后更改每个游标的值。我刚刚对其进行了测试,它似乎可以工作,但不确定它的效率如何。
    • 再次来自文档:“PostgreSQL 实际上将每个 SQL 语句视为在事务中执行。如果您不发出 BEGIN 命令,则每个单独的语句都有一个隐式 BEGIN 和(如果成功)COMMIT围绕着它。”因此,性能损失可能可以忽略不计。
    • 好的,谢谢。我实际上在文档中找到了更直接地回答问题的其他内容:“如果在稍后中止的事务中发出 SET(或等效的 SET SESSION),则当事务回滚时,SET 命令的效果会消失。一旦提交了周围的事务,效果将持续到会话结束,除非被另一个 SET 覆盖。”所以看起来我必须回滚以放弃更改。
    • 阅读整个部分很重要。紧接在上面的是:'SET LOCAL 的效果只持续到当前事务结束,无论是否提交。'
    猜你喜欢
    • 2016-12-16
    • 2011-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-01
    • 2018-05-20
    • 1970-01-01
    相关资源
    最近更新 更多