如何防止或避免在 PostgreSQL 中运行没有 where 子句的 update 和 delete 语句

Sre*_*ree 7 postgresql psql

如何防止或避免在 PostgreSQL 中运行没有 where 子句的 update 或 delete 语句?

与MySQL 中的SQL_SAFE_UPDATES语句相同,PostgreSQL 需要。

例如:

UPDATE table_name SET active=1; -- Prevent this statement or throw error message.
UPDATE table_name SET active=1 WHERE id=1; -- This is allowed
Run Code Online (Sandbox Code Playgroud)

我公司的数据库有许多具有插入和更新权限的用户,其中任何一个用户都会进行不安全的更新。在这个 secoario 如何处理这个。任何想法都可以编写触发器或任何扩展来处理 PostgreSQL 中的不安全更新。

cle*_*ens 3

我已关闭自动提交以避免这些错误。所以我总是有一个可以回滚的事务。您所要做的就是修改.psqlrc

\set AUTOCOMMIT off
\echo AUTOCOMMIT = :AUTOCOMMIT
\set PROMPT1 '%[%033[32m%]%/%[%033[0m%]%R%[%033[1;32;40m%]%x%[%033[0m%]%# '
\set PROMPT2 '%[%033[32m%]%/%[%033[0m%]%R%[%033[1;32;40m%]%x%[%033[0m%]%# '
\set PROMPT3 '>> '
Run Code Online (Sandbox Code Playgroud)

您不必插入PROMPT语句。但它们很有帮助,因为它们改变了psql显示交易状态的提示。

这种方法的另一个优点是它使您有机会防止任何错误的更改。

例子 (psql):

database=# SELECT * FROM my_table; -- implicit start transaction; see prompt
-- output result
database*# UPDATE my_table SET my_column = 1; -- missed where clause
UPDATE 525125 -- Oh, no!
database*# ROLLBACK; -- Puh! revert wrong changes
ROLLBACK
database=#   -- I'm completely operational and all of my circuits working perfectly
Run Code Online (Sandbox Code Playgroud)