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 по дате отправления:

Предыдущее
От: David Link
Дата:
Сообщение: bug tracking system
Следующее
От: Burra
Дата:
Сообщение: duplicate key triggers possible?