所有可能的查询都隐藏了条件

时间:2014-08-18 11:05:51

标签: sql postgresql

我想隐藏选择对象,而不是通过更简单的方式重写所有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'

如何让它运作?

2 个答案:

答案 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;