Re: Help with triggers - Mailing list pgsql-novice

From John Burski
Subject Re: Help with triggers
Date
Msg-id 3C03A9F1.2020009@911ep.com
Whole thread Raw
In response to Help with triggers  (John Burski <John.Burski@911ep.com>)
List pgsql-novice
Thanks for the information.  My approach may have worked for a while,
but growth would certainly have caused a problem.  I've decided to
change my design a bit, to include the following table:

acl_tbl (
   resource_id SERIAL,
   employee_id CHAR(8)
      REFERENCES employee_tbl(id)
      ON DELETE CASCADE
   PRIMARY KEY (resource_id, employee_id)
);


Each resource that requires an access list will have a column named
"resource_id" of type INTEGER.  I think this will be more utilitarian.
There may be more to this table, like a "who granted the permission"
column and an expiration timestamp.  I think I'll revisit my design and
see if there are any other similar stumbling blocks.

Thanks again.

Tom Lane wrote:

> John Burski <John.Burski@911ep.com> writes:
>
>> 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';
>
>
> plpgsql can't substitute plpgsql variable names into utility statements,
> only into the "big 4" query types (select/insert/update/delete).  You
> could make this work by forming the CREATE TABLE command as a string and
> feeding it to EXECUTE.
>
> However, my counsel is to forget this approach entirely and change your
> database design.  Creating tables on-the-fly as data items come in is
> going to be a constant headache for you; SQL just isn't designed to make
> that work conveniently, and databases with thousands of tables in them
> are going to have performance problems too.  You'd be a lot better off
> to merge all of these on-the-fly access_list tables into one big,
> permanent access_list table with a couple more columns serving as keys.
> Something like
>
> CREATE TABLE access_list (
>     area1 text,
>     area2 text,
>         id char(8)
>             REFERENCES employee_tbl
>             ON DELETE CASCADE,
>     unique(area1, area2, id));
>
> (You weren't clear about what the two components of your area_acl
> names really were, so I've called them area1 and area2 here.)
>
> With this approach all of your routine operations are simple DML
> (insert/update/delete), not DDL (create/delete table).  DML stuff
> tends to be a lot better optimized in Postgres, and most other DBMSes
> that I've heard of.  You'll also find yourself able to use the regular
> foreign key support for lots of things that would take custom triggers
> in the multi-table design --- for example, making the individual
> access_list tables go away again at appropriate times.
>
>             regards, tom lane
>
> ---------------------------(end of broadcast)---------------------------
> TIP 5: Have you checked our extensive FAQ?
>
> http://www.postgresql.org/users-lounge/docs/faq.html
>
>

--
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 by date:

Previous
From: Andrew Bell
Date:
Subject: Primary Keys
Next
From: Tom Lane
Date:
Subject: Re: Primary Keys