是否可以安全地假设如果 SQL 查询以“SELECT”开头,它不会更改数据库状态?

sza*_*i20 1 sql postgresql

简洁版本:

标题基本上。换句话说,如果 PostgreSQL 查询以“SELECT”开头,那么可以安全地假设该查询是只读的,即不更改数据库中的任何内容吗?

详细版本:

我通过将 READ 查询分派到只读副本实例来扩展面向对象的多组件应用程序的 PostgreSQL 数据库。应用程序中的每个组件都负责构建其查询,但所有查询最终都在一个组件中分派到数据库执行。我不希望其他组件处理区分读取查询和非读取查询的任务。我只希望负责查询处理的组件来处理它。因此,我正在寻找一种方法来检测只读查询并将它们分派到只读副本数据库而不是主数据库以平衡主数据库上的负载。

我当前的解决方案是检查查询是否以“SELECT”开头,如果是,则将其标记为只读并安全地将其分派到只读副本数据库。我做错了吗?

小智 5

不,这样的假设并不安全。

在Postgres中,函数允许运行DML和DDL语句,所以

select some_function();
Run Code Online (Sandbox Code Playgroud)

可以更改数据库。

create table ... as select ...Postgres 还有一个以 SELECT 开头的非标准替代方案

 select *
   into some_table
 from ...
Run Code Online (Sandbox Code Playgroud)

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

  • `select 'something' into this_table_gets_created;` 将是另一个例子 (3认同)