Search Postgresql Archives

Creating multiple Rules for on update

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I have a view joining two tables with a (1 to 1) relationship.  I am trying to create two update
rules (1 rule for each table in the view).  To accomplish this I am trying (unsuccessfully) to use
the where condition syntax of the update rules.

Basically, I only want to update a table if the columns related to its tuple are altered.  If
possible, I don't want to update/touch a tuple from a table who's data remains unchanged. 
However, the where conditions that I am using to make this distinction are giving the following
error:

"ERROR:  cannot update a view"
"HINT:  You need an unconditional ON UPDATE DO INSTEAD rule."

Ofcourse, if my understanding of the use of the rule's WHERE condition is why off base, I would be
enteresting in knowing the proper way it should be used.

Here are my sample table, view, and rule definitions: <rule are at the bottom>




CREATE SEQUENCE public.person_seq
INCREMENT BY 1
START WITH 1
;


CREATE TABLE public.person
(
id integer primary key not null
	    default nextval('public.person_seq'),
name varchar(30) unique not null
)
;

ALTER SEQUENCE public.person_seq OWNED BY public.person.id;


CREATE TABLE public.husband
(
id integer primary key
	   references person(id),
tiesize	integer	not null
)
; 


CREATE OR REPLACE VIEW public.vhusband (id, name, tiesize)  AS
SELECT
	A.id, A.name, B.tiesize
FROM
	public.person as A
INNER JOIN
	public.husband as B
ON
	A.id = B.ID
;


CREATE OR REPLACE RULE 
			vhusband_update_person 
AS ON UPDATE TO 
			public.vhusband
WHERE 

-- this is where I am trying to constrain which table
-- gets updated. Since name in only in the person table.
	(NEW.name)<>(OLD.name) 


DO INSTEAD
(
	UPDATE 
		public.person
	SET 
		name = NEW.name	       
	WHERE 
		id = OLD.id
)
;

CREATE OR REPLACE RULE 
			vhusband_update_husband 
AS ON UPDATE TO 
			public.vhusband
WHERE 

-- this is where I am trying to constrain which table
-- gets updated. Since tiesize in only in the husband table.
	(NEW.tiesize)<>(OLD.tiesize)
DO INSTEAD
(
	UPDATE
		public.husband
	SET
		tiesize = NEW.tiesize
	WHERE
		id = OLD.id
)
;

Regards,

Richard Broersma Jr.


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux