Help with triggers
От | John Burski |
---|---|
Тема | Help with triggers |
Дата | |
Msg-id | 3C027B0C.2060208@911ep.com обсуждение исходный текст |
Ответы |
Re: Help with triggers
(Tom Lane <tgl@sss.pgh.pa.us>)
|
Список | 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.Burski@911ep.com 800-863-6911, extension 221 FAX: 800-863-2991 www.911ep.com
В списке pgsql-novice по дате отправления: