Foreign Key issue - pg_shadow

Started by Rod Taylorabout 25 years ago3 messageshackers
Jump to latest
#1Rod Taylor
rbt@rbt.ca

I suppose the below reference isn't intended to be done. But, I'd
like to extend the pg_shadow table to store information about the
database users and some of their actions (a history of changes).

Is it safe to add a UNIQUE constraint to the usesysid or usename
columns?

temp=# \d pg_shadow

Table "pg_shadow"

Attribute | Type | Modifier

-------------+---------+----------

usename | name |

usesysid | integer |

usecreatedb | boolean |

usetrace | boolean |

usesuper | boolean |

usecatupd | boolean |

passwd | text |

valuntil | abstime |

temp=#

temp=# CREATE TABLE users (

temp(# pg_username name NOT NULL

temp(# REFERENCES pg_shadow(usesysid)

temp(# ON UPDATE CASCADE

temp(# ON DELETE RESTRICT

temp(# );

NOTICE: CREATE TABLE will create implicit trigger(s) for FOREIGN KEY
check(s)

ERROR: UNIQUE constraint matching given keys for referenced table
"pg_shadow" not found

temp=#

--
Rod Taylor

There are always four sides to every story: your side, their side, the
truth, and what really happened.

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Rod Taylor (#1)
Re: Foreign Key issue - pg_shadow

"Rod Taylor" <rod.taylor@inquent.com> writes:

I suppose the below reference isn't intended to be done. But, I'd
like to extend the pg_shadow table to store information about the
database users and some of their actions (a history of changes).
Is it safe to add a UNIQUE constraint to the usesysid or usename
columns?

You can't do either of those things, at least not without modifying
code in the backend. The code that manipulates pg_shadow entries knows
exactly what indexes exist on the table, so you can't just go and create
more. Also, that code will not fire triggers, so even if the correct
unique index existed, you would not get correct referential integrity
behavior.

However, it does seem like an oversight that we don't use unique indexes
to enforce uniqueness of usename and usesysid. Too late to fix it for
7.1 (unless we want to force another initdb), but it ought to get fixed.
Bruce, a TODO item please?

regards, tom lane

#3Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#2)
Re: Foreign Key issue - pg_shadow

"Rod Taylor" <rod.taylor@inquent.com> writes:

I suppose the below reference isn't intended to be done. But, I'd
like to extend the pg_shadow table to store information about the
database users and some of their actions (a history of changes).
Is it safe to add a UNIQUE constraint to the usesysid or usename
columns?

You can't do either of those things, at least not without modifying
code in the backend. The code that manipulates pg_shadow entries knows
exactly what indexes exist on the table, so you can't just go and create
more. Also, that code will not fire triggers, so even if the correct
unique index existed, you would not get correct referential integrity
behavior.

However, it does seem like an oversight that we don't use unique indexes
to enforce uniqueness of usename and usesysid. Too late to fix it for
7.1 (unless we want to force another initdb), but it ought to get fixed.
Bruce, a TODO item please?

Added to TODO:

* Add unique indexes to pg_shadow.usename and pg_shadow.usesysid

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026