Thread: Foreign keys and pg_user table

Foreign keys and pg_user table

From
"C G"
Date:
Dear All,

I'm trying to create a table where the username and email can only be
inserted into the table if the username is already in pg_user. The method
I'm trying is:

CREATE user(
  usename name,
  email text,
  FOREIGN KEY usename REFERENCES (pg_user)
);

but I get told that "...pg_user is not a table."

Is there another way of doing what I want?

Many thanks

Colin

_________________________________________________________________
Stay in touch with absent friends - get MSN Messenger
http://www.msn.co.uk/messenger


Re: Foreign keys and pg_user table

From
Stephan Szabo
Date:
On Thu, 11 Dec 2003, C G wrote:

> I'm trying to create a table where the username and email can only be
> inserted into the table if the username is already in pg_user. The method
> I'm trying is:
>
> CREATE user(
>   usename name,
>   email text,
>   FOREIGN KEY usename REFERENCES (pg_user)
> );
>
> but I get told that "...pg_user is not a table."

Which is true, it's a view.  However, even were it a table,
it's a system table and references to them are not allowed (in recent
versions it'll fail to make the constraint, in older versions it would
make the constraint but it wouldn't work).

> Is there another way of doing what I want?

You could potentially do the insert/update on user time check in a custom
trigger.  That wouldn't prevent you from dropping a user later that was
referenced, however.

Re: Foreign keys and pg_user table

From
dj trombley
Date:
    Well, it's not a table!  It's a view:

dbs=# \d pg_user
     View "pg_catalog.pg_user"
   Column    |  Type   | Modifiers
-------------+---------+-----------
 usename     | name    |
 usesysid    | integer |
 usecreatedb | boolean |
 usesuper    | boolean |
 usecatupd   | boolean |
 passwd      | text    |
 valuntil    | abstime |
 useconfig   | text[]  |
View definition:
 SELECT pg_shadow.usename, pg_shadow.usesysid, pg_shadow.usecreatedb,
pg_shadow.usesuper, pg_shadow.usecatupd, '********'::text AS passwd,
pg_shadow.valuntil, pg_shadow.useconfig
   FROM pg_shadow;

So, you really want to use the pg_shadow table.

C G wrote:

>
> but I get told that "...pg_user is not a table."
>
> Is there another way of doing what I want?