Skip to content

定义

视图就是由查询语句定义的虚拟表。视图默认是只读的

为什么使用视图:

  • 可使复杂的查询易于理解和使用
  • 安全原因,视图可以隐藏一些数据,如在一张用户表中,可以通过定义视图把密码等敏感字段去掉
  • 把一些函数返回的结果映射成视图

创建视图

sql

create table users (
  id int,
  user_name varchar(40),
  password varchar(256),
  user_email text,
  user_mark text
);

create view vm_users as select id, user_name, user_email, user_mark from users;
sql

create temp view vm_users as select id, user_name, user_email, user_mark from users;
sql

create view vm_users(no, name, email, mark) as select id, user_name, user_email, user_mark from users;

可更新视图

通过创建触发器实现

sql

# 触发器-插入函数
create or replace function vm_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 vm_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 vm_users_delete_trigger()
returns trigger as
$$
begin
  delete from users where id = NEW.id;
  return null;
end;
$$
language plpgsql;


# 触发器 - 插入
create trigger insert_vm_users_trigger
  instead of insert on vm_users
  for each row execute procedure vm_users_insert_trigger();

# 触发器 - 更新
create trigger update_vm_users_trigger
  instead of update on vm_users
  for each row execute procedure vm_users_update_trigger();

# 触发器 - 删除
create trigger delete_vm_users_trigger
  instead of delete on vm_users
  for each row execute procedure vm_users_delete_trigger();