Обсуждение: Update and Insert in a View Insert Rule
Hello all,
I have a table jobs that holds both historical and current jobs:
jobid SERIAL
jobemployee INT4
jobiscurrent INT2
etc
the users manipulate two views: historicaljob and currentjob. These
views are simply defined by the value of jobiscurrent (0 for historical,
1 for current - yes i know it should be a boolean but erwin won't
generate a postgres boolean may it rot in hell)
now i have the insert rule working fine for historical jobs. however
for currentjob, there is a small twist. First the old current job must
be set to historical, then the new current job inserted.
my insert rule is:
CREATE RULE insert_current_job AS
ON INSERT TO currentjob
DO INSTEAD
UPDATE job set jobiscurrent=0, lastuser=New.lastuser
WHERE jobemployee = NEW.jobemployee and jobiscurrent=1;
INSERT INTO job (
jobemployee,
jobagencybureau,
jobbranch,
blah, blah, blah,
jobiscurrent
) VALUES (
NEW.jobemployee,
NEW.jobagencybureau,
NEW.jobbranch,
blah, blah, blah,
1
)
unfortunately this gives me an error when I attempt to load the rule I
get:
ERROR: NEW used in non-rule query
I don't understand why this wouldn't work. Unless it has something to
do with NEW getting "lost" in the update call? should i move the update
out to a function and calling it from the rule?
thanks for your time
--
Tom Jenkins
Development InfoStructure
http://www.devis.com
On 21 May 2002, Tom Jenkins wrote: > Hello all, > I have a table jobs that holds both historical and current jobs: > jobid SERIAL > jobemployee INT4 > jobiscurrent INT2 > etc > > the users manipulate two views: historicaljob and currentjob. These > views are simply defined by the value of jobiscurrent (0 for historical, > 1 for current - yes i know it should be a boolean but erwin won't > generate a postgres boolean may it rot in hell) > > now i have the insert rule working fine for historical jobs. however > for currentjob, there is a small twist. First the old current job must > be set to historical, then the new current job inserted. > > my insert rule is: > > CREATE RULE insert_current_job AS > ON INSERT TO currentjob > DO INSTEAD > UPDATE job set jobiscurrent=0, lastuser=New.lastuser > WHERE jobemployee = NEW.jobemployee and jobiscurrent=1; > INSERT INTO job ( > jobemployee, > jobagencybureau, > jobbranch, > blah, blah, blah, > jobiscurrent > ) VALUES ( > NEW.jobemployee, > NEW.jobagencybureau, > NEW.jobbranch, > blah, blah, blah, > 1 > ) > > unfortunately this gives me an error when I attempt to load the rule I > get: > ERROR: NEW used in non-rule query > > I don't understand why this wouldn't work. Unless it has something to > do with NEW getting "lost" in the update call? should i move the update > out to a function and calling it from the rule? I think you forgot to use the () around the multiple actions. It should probably be: DO INSTEAD ( ... );
On Tue, 2002-05-21 at 18:19, Stephan Szabo wrote: > On 21 May 2002, Tom Jenkins wrote: > > > > unfortunately this gives me an error when I attempt to load the rule I > > get: > > ERROR: NEW used in non-rule query > > > > I don't understand why this wouldn't work. Unless it has something to > > do with NEW getting "lost" in the update call? should i move the update > > out to a function and calling it from the rule? > > I think you forgot to use the () around the multiple actions. > It should probably be: > DO INSTEAD ( > ... > ); > AAAARRRRRGGGGGGHHHHHHH!!! *sigh* up that was the problem. Funny how you can stare at something and not actually see it. Thanks -- Tom Jenkins Development InfoStructure http://www.devis.com