前面介绍了 PostgreSQL 常用管理命令、访问控制与认证、语法、数据类型、常用函数、锁操作、执行计划 介绍相关的知识点,今天我将详细的为大家介绍 PostgreSQL 视图与触发器相关知识,希望大家能够从中收获多多!如有帮助,请点在看、转发支持一波!!!
概述
视图(View)本质上是一个存储在数据库中的查询语句。视图本身不包含数据,也被称为虚拟表。 我们在创建视图时给它指定了一个名称,然后可以像表一样对其进行查询。
优势
-
不保存数据,节省空间。
-
减少频繁调用 sql 的重复书写。
-
可控制数据访问,隐藏不想对外展示的数据。
劣势
-
可能增加数据库压力,严重时会妨碍整个数据库的运行。(常见于复杂视图)
语法
创建视图
CREATE [ OR REPLACE ] [ TEMP | TEMPORARY ] [ RECURSIVE ] VIEW name [ ( column_name [, ...] ) ]
[ WITH ( view_option_name [= view_option_value] [, ... ] ) ]
AS query
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
CREATE VIEW:#定义一个查询的视图。
CREATE OR REPLACE VIEW:#如果已经存在一个同名视图,该视图会被替换(限制:只能在原视图基础上增加字段,不能减少字段,且增加字段顺序只能排在最后)。
TEMPORARY|TEMP:#视图被创建为一个临时视图。在当前会话结束时会自动删掉。当临时视图存在时,具有相同名称的已有永久视图对当前会话不可见,除非用模式限定的名称引用它们。如果视图引用的任何表是临时的,视图将被创建为临时视图(不管有没有指定TEMPORARY)。
RECURSIVE:创建一个递归视图。
name:#要创建的视图的名字(可以是模式限定的)。
column_name:#要用于视图列的名称列表,可选。如果没有给出,列名会根据查询推导。
WITH ( view_option_name [= view_option_value] [, … ] ):#这个子句为视图指定一些可选的参数,支持下列参数:
check_option (enum):#这个参数可以是 local 或者cascaded,并且它等效于指定 WITH [ CASCADED | LOCAL ] CHECK OPTION(见下文)。 可以使用 ALTER VIEW 在一个现有视图上修改这个选项。
security_barrier (boolean):#如果希望视图提供行级安全性,应该使用这个参数。
query:#提供视图的行和列的一个 SELECT 或者 VALUES 命令。
WITH [ CASCADED | LOCAL ] CHECK OPTION:#这个选项控制自动可更新视图的行为。这个选项被指定时,将检查该视图上的 INSERT 和UPDATE 命令以确保新行满足视图的定义条件(也就是,将检查新行来确保通过视图能看到它们)。如果新行不满足条件,更新将被拒绝。如果没有指定 CHECK OPTION,会允许该视图上的 INSERT 和 UPDATE 命令创建通过该视图不可见的行。支持下列检查选项:
LOCAL:#只根据直接定义在该视图本身的条件检查新行。任何定义在底层基视图上的 条件都不会被检查(除非它们也指定了CHECK OPTION)。
CASCADED:#会根据该视图和所有底层基视图上的条件检查新行。如果 CHECK OPTION 被指定,并且没有指定 LOCAL 和 CASCADED,则会假定为 CASCADED。 CHECK OPTION 不应该和 [RECURSIVE]视图一起使用。注意,只有在自动可更新的、没有 NSTEAD OF 触发器或者 INSTEAD 规则的视图上才支持 CHECK OPTION。 如果一个自动可更新的视图被定义在一个具有 INSTEAD OF 触发器的基视图之上,那么 LOCAL CHECK OPTION 可以被用来检查该自动可更新的视图之上的条件,但具有 INSTEAD OF 触发器的基视图上的条件不会被检查(一个级联检查选项将不会级联到一个 触发器可更新的视图,并且任何直接定义在一个触发器可更新视图上的检查 选项将被忽略)。如果该视图或者任何基础关系具有导致 INSERT 或 UPDATE 命令被重写的 INSTEAD 规则,那么在被重写的查询中将忽略所有检查选项,包括任何来自于定义在带有 INSTEAD 规则的关系之上的自动可更新视图的检查。
修改视图
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 | CURRENT_USER | SESSION_USER }
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 [, ... ] )
name:#一个现有视图的名称(可以是模式限定的)。
column_name:#现有列的名称。
new_column_name:#现有列的新名称。
IF EXISTS:#该视图不存在时不要抛出一个错误。这种情况下会发出一个提示。
SET/DROP DEFAULT:#这些形式为一个列设置或者移除默认值。对于任何在该视图上的 INSERT 或者 UPDATE 命令,一个视图列的默认值会在引用该视图的任何规则或触发器之前被替换进来。因此,该视图的默认值将会优先于来自底层关系的任何默认值。
new_owner:#该视图的新拥有者的用户名。
new_name:#该视图的新名称。
new_schema:#该视图的新模式。
SET ( view_option_name [= view_option_value] [, … ] )/RESET ( view_option_name [, … ] ):#设置或者重置一个视图选项。当前支持的选项有:
check_option (enum):#更改该视图的检查选项。值必须是 local 或者 cascaded。
security_barrier (boolean):#更改该视图的安全屏障属性。值必须是一个布尔值,如 true 或者 false。