Re: triggers vs "NEW" pseudorecord

From: will trillich <will(at)serensoft(dot)com>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: triggers vs "NEW" pseudorecord
Date: 2001-03-04 17:31:48
Message-ID: 20010304113148.C3610@mail.serensoft.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Sun, Mar 04, 2001 at 07:07:24AM -0500, Jan Wieck wrote:
> will trillich wrote:
> > so altho the docs elsewhere say NOT to rely on access to the
> > pseudo table NEW within a trigger function, this part does work
> > like it should. but when i add SELECT or UPDATE it complains of
> > "NEW used in non-RULE query" -- what's the distinction?
>
> Can't reproduce such an error here - neither with 7.0.3 nor
> with 7.1. Could you please post a complete, reproduceable
> example of the failure. Tables, functions, trigger
> declarations, queries.

many thanks for your reply! and now ai have a new question (of course)--

i think i figured out the original snag -- i moved my assignments
OUT of the DECLARE section, and everything got much better:

declare
x char(1) := NEW.afield from 1 for 1; -- BOOM ("new in non-rule query")

now i do

declare
x char(1);
begin
x := NEW.afield from 1 for 1; -- no worries, mate

and it works like a charm. (maybe this is a feature. :)

--

but now that i have it working, it's horrendously slow and i can't
figure out how or where to optimize my results...

ratings table insertions propagate to
- course table (which also links to course)
- topic table (which also links to school)
- school table
- prof table (which also links to course and person)
- faculty table (which also links to school and person)
- student table

first i check to be sure each selector/seeker is legal, then i
update all six table, which seems like double work... any
suggestions are welcome:

SELECT school.id
INTO schoolID
WHERE school.code = NEW.schoolcode;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

SELECT topic.id
INTO topicID
WHERE topic.code = NEW.topiccode AND topic.school = schoolID;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

SELECT course.id
INTO courseID
WHERE course.code = NEW.coursecode AND course.topic = topicID;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

SELECT person.id
INTO facID -- all activity for this faculty member
WHERE faculty.login = NEW.faclogin AND faculty.id = person.id AND prof.school = schoolID;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

SELECT person.id
INTO profID -- feedback for this person teaching this course
WHERE person.login = NEW.proflogin AND prof.id = person.id AND prof.course = courseID;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

SELECT person.id
INTO stuID -- track feedback from this student
WHERE person.login = NEW.stulogin AND student.id = person.id;
IF NOT FOUND THEN
RAISE EXCEPTION ...;
END IF;

-- ---------------------------------------------------
-- and after all that, NOW we gotta UPDATE them all...
-- ---------------------------------------------------

IF feedback = ''A'' THEN
UPDATE student SET a = a + 1 WHERE id = stuID;
UPDATE faculty SET a = a + 1 WHERE id = facID AND school = schoolID;
UPDATE prof SET a = a + 1 WHERE id = profID AND course = courseID;
UPDATE school SET a = a + 1 WHERE id = schoolID;
UPDATE topic SET a = a + 1 WHERE id = topicID AND school = schoolID;
UPDATE course SET a = a + 1 WHERE id = courseID AND topic = topicID;
//snip//for each grade type//
END IF

if any of y'all'uns have some ideas, i'd like to hear them--

--
http://groups.yahoo.com/group/newbieDoc -- we need your brain!
http://www.dontUthink.com/ -- your brain needs us!

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Peter Eisentraut 2001-03-04 18:17:57 Re: Two way encription in PG???
Previous Message Ian deSouza 2001-03-04 17:22:46 Inserting values into a SERIAL field