如何在postgresql中正确实现软删除?
在我的postgres 9.3数据库中,我有以下功能和触发器的组合来实现软删除功能:如何在postgresql中正确实现软删除?,postgresql,Postgresql,在我的postgres 9.3数据库中,我有以下功能和触发器的组合来实现软删除功能: ALTER TABLE "LIBN02"."trigger_test_1" ADD COLUMN delete_ind integer CREATE OR REPLACE FUNCTION trigger_test_1_soft_delete() RETURNS trigger AS $$ DECLARE command text := ' SET delete_ind = 1 W
ALTER TABLE "LIBN02"."trigger_test_1"
ADD COLUMN delete_ind integer
CREATE OR REPLACE FUNCTION trigger_test_1_soft_delete()
RETURNS trigger AS $$
DECLARE
command text := ' SET delete_ind = 1 WHERE uuid_col = $1';
BEGIN
EXECUTE 'UPDATE ' || "LIBN02"."trigger_test_1" || command USING OLD.uuid_col;
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER test_1_soft_delete_trigger
BEFORE DELETE ON "LIBN02"."trigger_test_1"
FOR EACH ROW EXECUTE PROCEDURE trigger_test_1_soft_delete();
完成上述所有操作后,我运行以下delete语句:
DELETE FROM "LIBN02"."trigger_test_1"
我得到以下错误:
ERROR: missing FROM-clause entry for table "LIBN02"
LINE 1: SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
^
QUERY: SELECT 'UPDATE ' || "LIBN02"."trigger_test_1" || command
CONTEXT: PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE
********** Error **********
ERROR: missing FROM-clause entry for table "LIBN02"
SQL state: 42P01
Context: PL/pgSQL function trigger_test_1_soft_delete() line 5 at EXECUTE
要使其正常工作,我应该更改什么?您收到的错误是因为
LIBN02.“trigger\u test\u 1”
不是一个字符串(它们用单引号引起来),而是一个标识符。你应该使用
EXECUTE 'UPDATE "' || TG_TABLE_SCHEMA || '"."' || TG_TABLE_NAME || '" ' || command
USING OLD.uuid_col;
您还可以在
WHERE
子句中添加和不删除,以避免不必要的搅动。为什么要使用动态SQL。这完全没有必要,只需使用更新“LIBN02”。trigger\u test\u 1 set delete\u ind=1,其中uuid\u col=OLD.uuid\u col代码>请阅读此问题: