diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2002-03-21 23:27:25 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2002-03-21 23:27:25 +0000 |
commit | 56c9b73c1d426c79a604df6d6f36293dd9f18754 (patch) | |
tree | e381610845e8693ec025af08f4ddc405247461d9 /src/backend/commands/trigger.c | |
parent | 6137ed1b591920d919e437fbf6e2ea07de44a883 (diff) | |
download | postgresql-56c9b73c1d426c79a604df6d6f36293dd9f18754.tar.gz postgresql-56c9b73c1d426c79a604df6d6f36293dd9f18754.zip |
Change the aclchk.c routines to uniformly use OIDs to identify the
objects to be privilege-checked. Some change in their APIs would be
necessary no matter what in the schema environment, and simply getting
rid of the name-based interface entirely seems like the best way.
Diffstat (limited to 'src/backend/commands/trigger.c')
-rw-r--r-- | src/backend/commands/trigger.c | 40 |
1 files changed, 21 insertions, 19 deletions
diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index 5bef86e3061..2fa17612e37 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.106 2002/03/21 16:00:34 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/trigger.c,v 1.107 2002/03/21 23:27:22 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -71,12 +71,18 @@ CreateTrigger(CreateTrigStmt *stmt) char *constrname = ""; Oid constrrelid = InvalidOid; + rel = heap_openr(stmt->relation->relname, AccessExclusiveLock); + + if (rel->rd_rel->relkind != RELKIND_RELATION) + elog(ERROR, "CreateTrigger: relation \"%s\" is not a table", + stmt->relation->relname); + if (!allowSystemTableMods && IsSystemRelationName(stmt->relation->relname)) elog(ERROR, "CreateTrigger: can't create trigger for system relation %s", stmt->relation->relname); - if (pg_aclcheck(stmt->relation->relname, GetUserId(), - stmt->isconstraint ? ACL_REFERENCES : ACL_TRIGGER) + if (pg_class_aclcheck(RelationGetRelid(rel), GetUserId(), + stmt->isconstraint ? ACL_REFERENCES : ACL_TRIGGER) != ACLCHECK_OK) elog(ERROR, "permission denied"); @@ -98,18 +104,14 @@ CreateTrigger(CreateTrigStmt *stmt) * NoLock is probably sufficient here, since we're only * interested in getting the relation's OID... */ - rel = heap_openr(stmt->constrrel->relname, NoLock); - constrrelid = rel->rd_id; - heap_close(rel, NoLock); + Relation conrel; + + conrel = heap_openr(stmt->constrrel->relname, NoLock); + constrrelid = conrel->rd_id; + heap_close(conrel, NoLock); } } - rel = heap_openr(stmt->relation->relname, AccessExclusiveLock); - - if (rel->rd_rel->relkind != RELKIND_RELATION) - elog(ERROR, "CreateTrigger: relation \"%s\" is not a table", - stmt->relation->relname); - TRIGGER_CLEAR_TYPE(tgtype); if (stmt->before) TRIGGER_SETT_BEFORE(tgtype); @@ -321,20 +323,20 @@ DropTrigger(DropTrigStmt *stmt) int found = 0; int tgfound = 0; + rel = heap_openr(stmt->relation->relname, AccessExclusiveLock); + + if (rel->rd_rel->relkind != RELKIND_RELATION) + elog(ERROR, "DropTrigger: relation \"%s\" is not a table", + stmt->relation->relname); + if (!allowSystemTableMods && IsSystemRelationName(stmt->relation->relname)) elog(ERROR, "DropTrigger: can't drop trigger for system relation %s", stmt->relation->relname); - if (!pg_ownercheck(GetUserId(), stmt->relation->relname, RELNAME)) + if (!pg_class_ownercheck(RelationGetRelid(rel), GetUserId())) elog(ERROR, "%s: %s", stmt->relation->relname, aclcheck_error_strings[ACLCHECK_NOT_OWNER]); - rel = heap_openr(stmt->relation->relname, AccessExclusiveLock); - - if (rel->rd_rel->relkind != RELKIND_RELATION) - elog(ERROR, "DropTrigger: relation \"%s\" is not a table", - stmt->relation->relname); - /* * Search pg_trigger, delete target trigger, count remaining triggers * for relation. Note this is OK only because we have |