我想隐藏选择对象,而不是通过更简单的方式重写所有SQL查询。
因此,我想在特定表的数据库中添加规则(或其他内容)。例如。如果我们从网站删除用户,我们执行类似下一个的操作:
UPDATE user_common SET is_deleted='t' WHERE user_id=1234
并且无需重写有关用户的所有现有查询,条件隐藏:
SELECT first_name, second_name FROM user_common WHERE coins>200
上面的SELECT将以隐藏条件执行,例如:
SELECT first_name, second_name FROM user_common WHERE coins>200 AND is_deleted!='t'
如何让它运作?
答案 0 :(得分:2)
您可以通过视图完成您想要的任务。
create view v_table
select uc.*
from user_common uc
where is_deleted <> 't';
关键是对表的引用确实需要更改为视图。一种方法是重命名表,然后创建一个具有相同名称的视图:
alter table user_common to base_user_common;
create view user_common as
select uc.*
from user_common uc
where is_deleted <> 't';
答案 1 :(得分:2)
正如@Gordon在他的回答中指出的那样,你可以使用一个视图来隐藏已删除的行,并且(至少从Postgres 9.3开始),对该视图的更改将自动应用于基础表。 / p>
但是你可以更进一步,使用Postgres&#39;将视图上的DELETE
转换为基表的UPDATE
标志的is_deleted
s。 rule system。如果您从视图中排除is_deleted
本身,它应该与正常的&#34;几乎无法区分。表
CREATE TABLE user_common_base
(
user_id SERIAL PRIMARY KEY,
first_name TEXT,
second_name TEXT,
coins INTEGER,
is_deleted BOOLEAN DEFAULT false
);
CREATE VIEW user_common AS
SELECT
user_id,
first_name,
second_name,
coins
FROM user_common_base
WHERE NOT is_deleted;
CREATE RULE user_common_delete AS
ON DELETE TO user_common
DO INSTEAD
UPDATE user_common_base
SET is_deleted = true
WHERE id = OLD.id;