Mai*_*ori 6 sql postgresql rules
是否可以防止在PostgreSQL端删除表中的第一行?
我有一个类别表,我想防止删除默认类别,因为它可能会破坏应用程序.当然,我可以在应用程序代码中轻松完成,但在数据库中执行它会好得多.
我认为这与删除语句的规则有关,但是我在文档中找不到任何与我的问题有关的东西.
lc.*_*lc. 11
您想在表上定义BEFORE DELETE 触发器.当您尝试删除的行(或比赛由PK或有一个单独的"保护"布尔列),RAISE异常.
我不熟悉PostgreSQL语法,但看起来你就是这样做的:
CREATE FUNCTION check_del_cat() RETURNS trigger AS $check_del_cat$
BEGIN
IF OLD.ID = 1 /*substitute primary key value for your row*/ THEN
RAISE EXCEPTION 'cannot delete default category';
END IF;
END;
$check_del_cat$ LANGUAGE plpgsql;
CREATE TRIGGER check_del_cat BEFORE DELETE ON categories /*table name*/
FOR EACH ROW EXECUTE PROCEDURE check_del_cat();
Run Code Online (Sandbox Code Playgroud)
j.p*_*.p. 11
你想到规则系统是正确的.以下是与您的问题相匹配的示例的链接.它甚至比触发器更简单:
create rule protect_first_entry_update as
on update to your_table
where old.id = your_id
do instead nothing;
create rule protect_first_entry_delete as
on delete to your_table
where old.id = your_id
do instead nothing;
Run Code Online (Sandbox Code Playgroud)
一些答案错过了一点:还必须限制受保护行的更新.否则,可以先更新受保护的行,使其不再满足禁止删除标准,然后可以删除更新的行,因为它不再受到保护.
小智 5
我认为实现此目的的最佳方法是在此表上创建删除触发器.基本上,您必须编写存储过程以确保此"默认"类别始终存在,然后使用此表上的触发器ON DELETE事件强制执行该类别.执行此操作的一种好方法是创建每行触发器,以确保在DELETE事件中永远不会删除"默认"类别行.
请查看PostgreSQL关于触发器和存储过程的文档:
http://www.postgresql.org/docs/8.3/interactive/trigger-definition.html
http://www.postgresql.org/docs/8.3/interactive/plpgsql.html
这个wiki中还有一些有价值的例子:
http://wiki.postgresql.org/wiki/A_Brief_Real-world_Trigger_Example