【问题标题】:How to create trigger on delete from table to drop corresponding view?如何在从表中删除时创建触发器以删除相应的视图?
【发布时间】:2015-12-20 19:14:22
【问题描述】:

我想创建一个触发器,当包含视图名称的行从表中删除时删除视图。

考虑下表,查看。

CREATE TABLE views
(
  id serial NOT NULL, 
  name character varying(128) NOT NULL
  CONSTRAINT views_pkey PRIMARY KEY (id),
  CONSTRAINT views_name_unique UNIQUE (name)
);

CREATE OR REPLACE VIEW test AS 
SELECT * FROM views;

INSERT INTO views (name) VALUES('test');

我创建触发器以从表 views 删除视图:

CREATE OR REPLACE FUNCTION drop_view()

RETURNS trigger AS
$BODY$
DECLARE

viewname varchar(128);

BEGIN
    viewname := OLD.name;
    DROP VIEW IF EXISTS viewname;
    RETURN NULL;

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION drop_spatial_view()
  OWNER TO postgres;


CREATE TRIGGER del
  AFTER DELETE
  ON views
  FOR EACH ROW
  EXECUTE PROCEDURE drop_view();

当我从views 中删除行时,我得到一个错误:

DELETE FROM views WHERE name = 'test';

NOTICE:  view "viewname" does not exist, skipping
CONTEXT:  SQL statement "DROP VIEW IF EXISTS viewname"

似乎将值test 分配给变量viewname 存在问题。如何重写触发器使其工作?

【问题讨论】:

  • @lad2025,它是这样工作的,谢谢!

标签: postgresql triggers


【解决方案1】:

要在例程中使用 DDL 语法,您需要使用 Dynamic-SQL。

变化:

DROP VIEW IF EXISTS viewname;

到:

EXECUTE 'DROP VIEW IF EXISTS ' || viewname;

【讨论】:

    猜你喜欢
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    相关资源
    最近更新 更多