Help with triggers

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

Responses

Browse pgsql-novice by date

  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