postgresql 假设如果SQL查询以“SELECT”开头,它将不会更改DB状态,这是否安全?

gkn4icbw  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(1)|浏览(152)

简短版本:

换句话说,如果PostgreSQL查询以“SELECT”开头,那么假设该查询是只读的,即不更改DB中的任何内容,是否安全?

详细版本:

我正在为面向对象的多组件应用程序扩展PostgreSQL数据库,方法是将READ查询分派给读取副本示例,应用程序中的每个组件都负责构建自己的查询,但所有查询最终都在一个组件中分派到数据库中执行,我不希望其他组件处理区分读查询和非读查询的任务。我只想让负责查询处理的组件来处理它,因此,我正在寻找一种方法来检测只读查询,并将它们分派到读副本数据库而不是主数据库,以平衡主数据库上的负载。
我目前的解决方案是检查查询是否以“SELECT”开头,如果是,则将其标记为只读,并安全地将其调度到读副本DB。

evrscar2

evrscar21#

不,这不安全的假设。
在Postgres中,函数允许运行DML和DDL语句,因此

select some_function();

可以更改数据库。
Postgres还有一个以SELECT开头的create table ... as select ...的非标准替代方法

select *
   into some_table
 from ...

它将创建一个名为some_table的新表

相关问题