DB2视图是数据库中的一个虚拟表,它是基于一个或多个实际表的查询结果的表示
- 使用触发器:在基表上创建触发器,当基表中的数据发生变化时,触发器会自动更新视图。这种方法需要为每个基表创建一个触发器,并且当数据发生变化时,触发器会执行相应的操作来更新视图。
例如,假设我们有一个名为employees
的基表,我们想要创建一个名为employee_view
的视图,该视图包含员工的姓名和部门。我们可以创建一个触发器,当employees
表中的数据发生变化时,触发器会自动更新视图:
CREATE TRIGGER update_employee_view AFTER INSERT OR UPDATE OR DELETE ON employees FOR EACH ROW BEGIN IF INSERTING THEN -- 当插入新记录时,更新视图 EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW employee_view AS SELECT name, department FROM employees'; ELSIF UPDATING THEN -- 当更新记录时,重新构建视图 EXECUTE IMMEDIATE 'DROP VIEW IF EXISTS employee_view'; EXECUTE IMMEDIATE 'CREATE VIEW employee_view AS SELECT name, department FROM employees'; ELSIF DELETING THEN -- 当删除记录时,重新构建视图 EXECUTE IMMEDIATE 'DROP VIEW IF EXISTS employee_view'; EXECUTE IMMEDIATE 'CREATE VIEW employee_view AS SELECT name, department FROM employees'; END IF; END;
- 使用存储过程:创建一个存储过程,当需要更新视图时,调用该存储过程。这种方法可以避免为每个基表创建触发器,但需要在应用程序中显式调用存储过程来更新视图。
例如,我们可以创建一个名为update_employee_view
的存储过程,用于更新employee_view
视图:
CREATE OR REPLACE PROCEDURE update_employee_view AS BEGIN EXECUTE IMMEDIATE 'DROP VIEW IF EXISTS employee_view'; EXECUTE IMMEDIATE 'CREATE VIEW employee_view AS SELECT name, department FROM employees'; END;
当需要更新视图时,只需调用此存储过程即可:
CALL update_employee_view();
请注意,这些方法可能会导致性能问题,因为每次基表中的数据发生变化时,都需要重新构建视图。在实际应用中,您需要根据具体需求选择合适的方法。