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: