管理视图

数据库设计

Lis Sulmont

Curriculum Manager

创建更复杂的视图

  • 聚合: SUM(), AVG(), COUNT(), MIN(), MAX(), GROUP BY
  • 连接: INNER JOIN, LEFT JOIN. RIGHT JOIN, FULL JOIN
  • 条件: WHERE, HAVING, UNIQUE, NOT NULL, AND, OR,>,<
数据库设计

授予与回收视图访问权限

GRANT privilege(s)REVOKE privilege(s)

ON object

TO roleFROM role

  • 权限: SELECT, INSERT, UPDATE, DELETE
  • 对象: 表、视图、模式等
  • 角色: 数据库用户或用户组
数据库设计

授予与回收示例

$$

GRANT UPDATE ON ratings TO PUBLIC;  

$$

REVOKE INSERT ON films FROM db_user;
数据库设计

更新视图

UPDATE films SET kind = 'Dramatic' WHERE kind = 'Drama';

并非所有视图都可更新

  • 视图仅由一个表组成
  • 不使用窗口或聚合函数
1 https://www.postgresql.org/docs/9.5/sql-update.html
数据库设计

向视图插入数据

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

并非所有视图都可插入

1 https://www.postgresql.org/docs/9.5/sql-insert.html
数据库设计

向视图插入数据

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

并非所有视图都可插入

要点:避免通过视图修改数据

1 https://www.postgresql.org/docs/9.5/sql-insert.html
数据库设计

删除视图

DROP VIEW view_name [ CASCADE | RESTRICT ];
  • RESTRICT(默认):若有对象依赖该视图则报错
  • CASCADE:删除该视图及所有依赖它的对象
数据库设计

重新定义视图

CREATE OR REPLACE VIEW view_name AS new_query
  • 若已存在同名视图,将被替换
  • new_query必须生成与旧查询相同的列名、顺序和数据类型
  • 列的输出内容可不同
  • 可在末尾新增列

若不满足以上条件,请先删除旧视图再新建

1 https://www.postgresql.org/docs/9.2/sql-createview.html
数据库设计

修改视图

ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name SET DEFAULT expression
ALTER VIEW [ IF EXISTS ] name ALTER [ COLUMN ] column_name DROP DEFAULT
ALTER VIEW [ IF EXISTS ] name OWNER TO new_owner
ALTER VIEW [ IF EXISTS ] name RENAME TO new_name
ALTER VIEW [ IF EXISTS ] name SET SCHEMA new_schema
ALTER VIEW [ IF EXISTS ] name SET ( view_option_name [= view_option_value] [, ... ] )
ALTER VIEW [ IF EXISTS ] name RESET ( view_option_name [, ... ] )
1 https://www.postgresql.org/docs/9.2/sql-alterview.html
数据库设计

Ayo berlatih!

数据库设计

Preparing Video For Download...