kir*_*tee 4 postgresql trigger postgresql-9.3
我正在尝试使更新视图的触发器起作用。如果我正在做并插入它就可以了!但是当我尝试进行 UPDATE 时,它只是不运行。
CREATE OR REPLACE FUNCTION test_trigger_function()
RETURNS trigger AS
$$
BEGIN
RAISE NOTICE 'hi';
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER test_trigger
INSTEAD OF INSERT OR UPDATE
ON specific_view
FOR EACH ROW
EXECUTE PROCEDURE test_trigger_function();
Run Code Online (Sandbox Code Playgroud)
然后在另一个地方我执行它:
RAISE NOTICE 'before';
UPDATE specific_view SET gender='randomstuff';
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
结果:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: after
Run Code Online (Sandbox Code Playgroud)
插入时:
RAISE NOTICE 'before';
INSERT INTO specific_view (gender)
VALUES ('randomstuff');
RAISE NOTICE 'after';
Run Code Online (Sandbox Code Playgroud)
返回:
psql:test_function.pgsql:134: NOTICE: before
psql:test_function.pgsql:134: NOTICE: hi
CONTEXT: SQL statement "INSERT INTO specific_view (gender)
VALUES ('randomstuff')"
PL/pgSQL function ... blahblahblah ... line 261 at SQL statement
psql:test_function.pgsql:134: NOTICE: after
Run Code Online (Sandbox Code Playgroud)
因为更新触发器在每行被更新时调用一次,所以如果没有行要被更新,它根本不会被调用。
你自己看:
create table test(i int);
create view test_view as select i from test;
CREATE OR REPLACE FUNCTION test_trigger_function()
RETURNS trigger AS
$$
BEGIN
RAISE NOTICE 'hi';
RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;
CREATE TRIGGER test_trigger
INSTEAD OF INSERT OR UPDATE
ON test_view
FOR EACH ROW
EXECUTE PROCEDURE test_trigger_function();
insert into test_view(i) values(1);
SELECT * FROM TEST;
SELECT * FROM test_view;
UPDATE test_view set i=1;
-- trigger did not fire
insert into test(i) values(1);
UPDATE test_view set i=3;
-- trigger fired
SELECT * FROM test_view;
Run Code Online (Sandbox Code Playgroud)