在使用 Postgresql 条件删除行之前创建触发器

问题描述 投票:0回答:1

例如我有这张桌子

CREATE TABLE public."table" (
    c1 int4 NOT NULL,
    c2 int4 NOT NULL,
    c3 int4 NOT NULL,
    d varchar(20) NULL,
    e varchar(20) NULL,
    f date NULL
        
    CONSTRAINT table_pkey PRIMARY KEY (c1, c2, c3)
);

我想添加一个限制,仅当指定c1和c2和c3时才可以删除,否则不允许删除

我的意思是

delete from public."table" where c1=X 

抛出错误!

delete from public."table" where c2=Y  

抛出错误!

delete from public."table" where c3=Z 

抛出错误!

delete from public."table" where c1=X and c2=Y 

抛出错误!

delete from public."table" where c1=X and c3=Z 

抛出错误!

等等

只有在以下情况下才可以删除

delete from public."table" where c1=X and c2=Y and c3=Z 

X,Y,Z 是随机值

我尝试

CREATE OR REPLACE FUNCTION verify_delete()
RETURNS TRIGGER AS $$
BEGIN

    IF OLD.c1 IS NULL OR OLD.c2 IS NULL OR OLD.c3 IS NULL THEN
        RAISE EXCEPTION 'ERROR!';
    END IF;


    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_verify_delete
BEFORE DELETE ON "table"
FOR EACH ROW
EXECUTE procedure verify_delete();

没有运气

有什么建议或想法吗?

postgresql stored-procedures triggers plpgsql delete-row
1个回答
0
投票

没有办法实现你的要求。您应该做什么取决于您真正的问题是什么。

如果您的问题是编写得不好的交互式语句可能会无意中删除太多行,则可以使用语句级触发器来解决该问题,如果转换表包含太多行,该触发器将引发错误。

© www.soinside.com 2019 - 2024. All rights reserved.