Re: [HACKERS] about RULES - Mailing list pgsql-hackers
From | Jose' Soares |
---|---|
Subject | Re: [HACKERS] about RULES |
Date | |
Msg-id | 36A89A2F.74E17A02@sferacarta.com Whole thread Raw |
In response to | Re: [HACKERS] about RULES (jwieck@debis.com (Jan Wieck)) |
Responses |
Re: [HACKERS] about RULES
(jwieck@debis.com (Jan Wieck))
|
List | pgsql-hackers |
Jose' Soares ha scritto: > > > > In the case of a qualified instead rule, the parsetree get's > > splitted. One with the qual, one with the negated qual. If > > you only want 'SALESMAN's, you must put the qualification > > into the INSERT action of the rule as > > > > create rule "_INSvista" as on insert to vista > > do instead > > insert into emp select new.empno, new.ename, new.job > > where new.job='SALESMAN'; > > I see that rules is more complex than I thougth. > > I tried your example Jan but it doesn't work... > > create rule "_INSvista" as on insert to vista > do instead > insert into emp select new.empno, new.ename, new.job > where new.job='SALESMAN'; > ERROR: Type of empno does not match target column ename > > -Jose'- I had no reply to this message probably because a problem with my mail. I'm trying to make a view updatable using triggers, INSERT works fine but UPDATE/DELETE doesn't because the WHERE condition is evaluated FALSE all the time. Here an example: create table emp ( empno int, ename char(10), job char(12), hiredate date, sal money, comm int, deptno int, level int, mgr int ); CREATE insert into emp values (8900,'MANUEL','SALESMAN',CURRENT_DATE,'$2,000'); INSERT 149844 1 create table vista as select empno, ename, job from emp where job='SALESMAN'; CREATE drop function add_vista(); create function add_vista() returns opaque as ' begin raise notice ''trigger fired: % on %'',tg_when,tg_op; return null; end; ' language 'plpgsql'; create trigger t_add_vista before insert or update or delete on vista for each row execute procedure add_vista(); delete from vista where ename='MANUEL'; NOTICE: trigger fired: BEFORE on DELETE DELETE 0 delete from vista ; NOTICE: trigger fired: BEFORE on DELETE DELETE 0 --And now VISTA becames a view:................. CREATE RULE "_RETvista" AS ON SELECT TO "vista" DO INSTEAD SELECT "empno", "ename", "job" FROM "emp" WHERE "job" = 'SALESMAN'::"bpchar"; CREATE select * from vista; empno|ename |job -----+----------+------------8900|MANUEL |SALESMAN (1 row) -- The where condition is all the time evaluated as FALSE... delete from vista where ename='MANUEL'; --why this condition isn't true ? DELETE 0 delete from vista ; NOTICE: trigger fired: BEFORE on DELETE DELETE 0 --Is there a way to make views updatable ? -Jose'-
pgsql-hackers by date: