Re: [HACKERS] about RULES

From: "Jose' Soares" <jose(at)sferacarta(dot)com>
To: sferac(at)bo(dot)nettuno(dot)it
Cc: Jan Wieck <jwieck(at)debis(dot)com>, pgsql-hackers(at)postgresql(dot)org
Subject: Re: [HACKERS] about RULES
Date: 1999-01-22 15:33:03
Message-ID: 36A89A2F.74E17A02@sferacarta.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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'-

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Al Dev 1999-01-22 15:45:28 Move PostgreSQL 6.4.2 RedHat RPM packages to proper locations
Previous Message Tom Lane 1999-01-22 15:19:16 Re: [HACKERS] getcwd failing suddenly