Foreign keys and pg_user table

Started by C Gover 22 years ago3 messagesgeneral
Jump to latest
#1C G
csgcsg39@hotmail.com

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

#2Stephan Szabo
sszabo@megazone23.bigpanda.com
In reply to: C G (#1)
Re: Foreign keys and pg_user table

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.

#3Dave Trombley
dtrom@bumba.net
In reply to: C G (#1)
Re: Foreign keys and pg_user table

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:

Show quoted text

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

Is there another way of doing what I want?