4.8 视图

6.8.1 什么是视图

  1. 视图就是由查询语句定义的虚拟表

  2. 使用视图一般出于几个原因:

    1. 可使复杂的查询易于理解和使用

    2. 安全原因,视图可以隐藏一些数据,如在一张用户表中,可以通过定义视图把密码等敏感字段去掉

    3. 把一些函数返回的结果映射成视图

  3. 数据库中提供的视图默认也是只读的,但也可以使用规则系统做出可更新的视图

6.8.2 创建视图

  1. 语法:

    CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] VIEW name [ ( column_name [, ...] ) ]
      AS query
  2. 示例视图

    CREATE VIEW 视图名 AS 查询语句;
  3. 创建一个临时视图,session结束就消失:

    CREATE TEMP VIEW 视图名 AS 查询语句;
  4. 创建视图定义别名

    CREATE VIEW 视图名(别名1, 别名2, 别名3, ...) AS 查询语句;

    注意:查询语句中的结果字段名需要与视图中定义的别名数量对应上

6.8.3 可更新视图

  1. 设置视图字段允许更新/删除规则

    CREATE RULE 规则名 AS
      ON UPDATE TO 视图名 DO INSTEAD UPDATE 表名 SET 字段名 = NEW.字段名;

    备注:规则名规范:vw_表名_操作名

  2. 通过触发器实现视图更新

    CREATE OR REPLACE FUNCTION vw_users_insert_trigger()
    RETURNS TRIGGER AS $$
    BEGIN
      INSERT INTO users VALUES(NEW.id, NEW.user_name,'111111', NEW.user_email, NEW.user_mark);
      RETURN NULL;
    END;
    $$
    LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION vw_users_update_trigger()
    RETURNS TRIGGER AS $$
    BEGIN
      UPDATE users SET user_email = NEW.user_email WHERE id= NEW.id;
      RETURN NULL;
    END;
    $$
    LANGUAGE plpgsql;
    
    CREATE OR REPLACE FUNCTION vw_users_delete_trigger()
    RETURNS TRIGGER AS $$
    BEGIN
      DELETE FROM  users WHERE id= NEW.id;
      RETURN NULL;
    END;
    $$
    LANGUAGE plpgsql;
    
    CREATE TRIGGER insert_vw_users_trigger
      INSTEAD OF INSERT ON vw_users
      FOR EACH ROW EXECUTE PROCEDURE vw_users_insert_trigger();
    
    CREATE TRIGGER update_vw_users_trigger
      INSTEAD OF UPDATE ON vw_users
      FOR EACH ROW EXECUTE PROCEDURE vw_users_update_trigger();
    
    CREATE TRIGGER delete_vw_users_trigger
      INSTEAD OF DELETE ON vw_users
      FOR EACH ROW EXECUTE PROCEDURE vw_users_delete_trigger();

    注意:触发器类型必须是INSTEAD OF,不能是BEFOREAFTER

最后更新于