From: | John Burski <John(dot)Burski(at)911ep(dot)com> |
---|---|
To: | pgsql-novice(at)postgresql(dot)org |
Subject: | Help with triggers |
Date: | 2001-11-26 17:25:32 |
Message-ID: | 3C027B0C.2060208@911ep.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-novice |
I'm having a bit of trouble creating a trigger.
First, a bit of background about what I'm trying to accomplish. I've
certain objects that will have restricted access (buildings, rooms and
areas for example). Each of these objects will have a table that
contains an ID, a description of the object, and the name of the talble
that constitutes the access control list. The access control list will
have the same format in all cases - a table of employee IDs that are
allowed access to the resource. When a new resource, a new area for
example, is added to the area table I would like the insertion into the
area_tbl to automatically create the corresponding access control list
table. (BTW, if there's an easier or better way to do this I'm all ears
- my paper rookie hat isn't wrinkled yet).
On to my case...
I've defined a table as follows:
CREATE TABLE area_tbl
(
id char(5) primary key,
description text not null,
access_list text -- A standard format has been defined.
-- See the "create_functions.sql" file for
-- a description.
);
The functions that create the access_list strings work OK - I tested
them prior to attempting to create a trigger. However, I'll include the
code in case there is something in there that causes a problem. Here it is:
-- The "make_acl_name" function is used to create a name for an
-- access control list table.
-- The standard format is "$1_$2_acl_tbl". For example, if you wanted
-- to create an access control list table name for "area 1" you would
-- use the function as follows:
-- make_acl_name('area','1');
CREATE FUNCTION make_acl_name(text,text)
RETURNS text
AS 'BEGIN
RETURN $1 || ''_'' || $2 || ''_acl_tbl'';
END;'
LANGUAGE 'plpgsql';
-- The "make_area_acl_name" function is used to create a name for
-- an access control list table as used in the "area_tbl" table.
CREATE FUNCTION make_area_acl_name(text)
RETURNS text
AS 'DECLARE
aclname text;
BEGIN
aclname = make_acl_name(''area'',$1);
RETURN aclname;
END;'
LANGUAGE 'plpgsql';
I've defined a trigger as follows:
CREATE FUNCTION create_acl_table()
RETURNS opaque
AS 'BEGIN
CREATE TABLE new.access_list (
id char(8) unique
REFERENCES employee_tbl
ON DELETE CASCADE);
END;'
LANGUAGE 'plpgsql';
-- This creates the actual trigger.
CREATE TRIGGER new_area_acl
AFTER INSERT
ON area_tbl
FOR EACH ROW
EXECUTE PROCEDURE create_acl_table();
Before I attempted to create the trigger I ran the following insert:
INSERT INTO area_tbl VALUES ('1', 'Area 1', make_area_acl_name('1') );
which worked OK.
After I created the trigger function and assigned it as a trigger (which
seemed to work OK - I didn't receive an error message) I ran a similar
insert that returned the following error message:
ERROR: parser: parse error at or near "$1"
When I dropped the trigger I could once again do inserts.
Thanks for your help.
--
John Burski
I.T. Manager and Systems Administration
911 Emergency Products, Inc.
25 Sixth Avenue North
Saint Cloud, MN 56303
John(dot)Burski(at)911ep(dot)com
800-863-6911, extension 221
FAX: 800-863-2991
www.911ep.com
From | Date | Subject | |
---|---|---|---|
Next Message | Burra | 2001-11-26 18:05:27 | duplicate key triggers possible? |
Previous Message | David Link | 2001-11-26 15:45:06 | bug tracking system |