Your problem is in your design.

If you do it like this:

CREATE TABLE A
(
p_col serial PRIMARY KEY,
acol  integer
);

CREATE TABLE B() INHERITS (A);

INSERT INTO A(acol) VALUES (1);
INSERT INTO B(acol) VALUES (2);

SELECT * FROM A;
SELECT * FROM B;

Then the sequence (p_col) will be UNIQUE across all tables and can be
referenced.
No need for a key table.

On Tue, Jun 2, 2015 at 3:45 PM, Andreas Ulbrich <
andreas.ulbr...@matheversum.de> wrote:

>  On 02.06.2015 16:20, Melvin Davidson wrote:
>
> You can use the following to list the triggers and see what functions they
> call. Then you can check pg_proc to see how TRUNCATE is used in prosrc.
>
>
> SELECT c.relname,
>        t.tgname,
>        p.proname        AS function_called,
>        t.tgconstraint   AS is_constraint,
>        CASE WHEN t.tgconstrrelid > 0
>             THEN (SELECT relname
>                    FROM pg_class
>                   WHERE oid = t.tgconstrrelid)
>             ELSE ''
>         END             AS constr_tbl,
>        t.tgenabled
>   FROM pg_trigger t
>   INNER JOIN pg_proc p  ON ( p.oid = t.tgfoid)
>   INNER JOIN pg_class c ON (c.oid = t.tgrelid)
>   WHERE tgname NOT LIKE 'pg_%'
>     AND tgname NOT LIKE 'RI_%'  -- < comment out to see constraints
> --    AND t.tgenabled = FALSE
>  ORDER BY 1;
>
>
> On Tue, Jun 2, 2015 at 5:31 AM, Albe Laurenz <laurenz.a...@wien.gv.at>
> wrote:
>
>> Andreas Ulbrich wrote:
>> > I'm in a handle for a trigger for TRUNCATE. Is it possible to find out
>> > whether the TRUNCATE TABLE ist called with CASCADE?
>>
>> I don't think there is.
>>
>> But you can find out the table where the trigger is defined and examine
>> if any foreign key constraints are referring to it.
>>
>> If yes, then the trigger was called with CASCADE.
>> If no, it might have been called either way, but the effect would be the
>> same.
>>
>> Yours,
>> Laurenz Albe
>>
>> --
>> Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
>> To make changes to your subscription:
>> http://www.postgresql.org/mailpref/pgsql-general
>>
>
>  I think, I must explain the problem deeper:
>
> I have two (or more) tables
> CREATE TABLE a (id ... UNIQUE -- maby the PRIMARY KEY,...);
> CREATE TABLE b (...) INHERIT (a);
>
> But the id has to be unique over the inheritance. So one solution of the
> problem is:
> CREATE key_table (id ... UNIQUE, table REGCLASS);
> By trigger every INSERT/UPDATE/DELETE in Table a,b,... changes the
> key_table.
> This works.
>
> Now I have a table reference to the id of table a*. This is not possible,
> but reference to key_table(id) works fine.
> CREATE TABLE r (..., a_id /* REFERENCES a*(id) */ REFERENCES
> key_tabel(id),..);
>
> And now the problem: Can I support TRUNCATE TABLE?
> DELETE is not a problem: for DELETE FROM a the trigger deletes the entry
> in the key_table and if the reference action on delete is CASCADE, the
> entries in r will be deletet.
>
> But TRUNCATE TABLE a! In a TRUNCATE TRIGGER I can delete the entries in
> the key_table "WHERE table = a" (O.K. the performance) -- it is actual not
> a TRUNCATE TABLE but a TRUNCATE PARTITION.
> And if I not specified ONLY, there is also a TRUNCATE TABLE b and the
> trigger ist fired too.
>
> But what is with table r? If I do the delete in the key_table, the delete
> action will be used. But there is not a truncate action, cascaded
> truncation is controlled by execute TRUNCATE. And so, I must delete the
> entries in r if there is a CASCADE in the TRUNCATE or raise an exception if
> the TRUNCATE is RESTRICTED.
>
> Now the Question? How to find out in the trigger function for truncate
> whether is there a CASCADE or not.
>
> regards, Andreas
>
>
> --
>  *Melvin Davidson*
> I reserve the right to fantasize.  Whether or not you
> wish to share my fantasy is entirely up to you.
>
>
>


-- 
*Melvin Davidson*
I reserve the right to fantasize.  Whether or not you
wish to share my fantasy is entirely up to you.

Reply via email to