mirror of https://github.com/postgres/postgres
have adequate mechanisms for tracking the contents of databases and tablespaces). This solves the longstanding problem that you can drop a user who still owns objects and/or has access permissions. Alvaro Herrera, with some kibitzing from Tom Lane.REL8_1_STABLE
parent
442b59dd8b
commit
59d1b3d99e
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,91 @@ |
|||||||
|
/*-------------------------------------------------------------------------
|
||||||
|
* |
||||||
|
* pg_shdepend.h |
||||||
|
* definition of the system "shared dependency" relation (pg_shdepend) |
||||||
|
* along with the relation's initial contents. |
||||||
|
* |
||||||
|
* |
||||||
|
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group |
||||||
|
* Portions Copyright (c) 1994, Regents of the University of California |
||||||
|
* |
||||||
|
* $PostgreSQL: pgsql/src/include/catalog/pg_shdepend.h,v 1.1 2005/07/07 20:39:59 tgl Exp $ |
||||||
|
* |
||||||
|
* NOTES |
||||||
|
* the genbki.sh script reads this file and generates .bki |
||||||
|
* information from the DATA() statements. |
||||||
|
* |
||||||
|
*------------------------------------------------------------------------- |
||||||
|
*/ |
||||||
|
#ifndef PG_SHDEPEND_H |
||||||
|
#define PG_SHDEPEND_H |
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* postgres.h contains the system type definitions and the |
||||||
|
* CATALOG(), BKI_BOOTSTRAP and DATA() sugar words so this file |
||||||
|
* can be read by both genbki.sh and the C compiler. |
||||||
|
* ---------------- |
||||||
|
*/ |
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* pg_shdepend definition. cpp turns this into |
||||||
|
* typedef struct FormData_pg_shdepend |
||||||
|
* ---------------- |
||||||
|
*/ |
||||||
|
#define SharedDependRelationId 1214 |
||||||
|
CATALOG(pg_shdepend,1214) BKI_SHARED_RELATION BKI_WITHOUT_OIDS |
||||||
|
{ |
||||||
|
/*
|
||||||
|
* Identification of the dependent (referencing) object. |
||||||
|
* |
||||||
|
* These fields are all zeroes for a DEPENDENCY_PIN entry. Also, |
||||||
|
* dbid can be zero to denote a shared object. |
||||||
|
*/ |
||||||
|
Oid dbid; /* OID of database containing object */ |
||||||
|
Oid classid; /* OID of table containing object */ |
||||||
|
Oid objid; /* OID of object itself */ |
||||||
|
|
||||||
|
/*
|
||||||
|
* Identification of the independent (referenced) object. This is |
||||||
|
* always a shared object, so we need no database ID field. |
||||||
|
*/ |
||||||
|
Oid refclassid; /* OID of table containing object */ |
||||||
|
Oid refobjid; /* OID of object itself */ |
||||||
|
|
||||||
|
/*
|
||||||
|
* Precise semantics of the relationship are specified by the deptype |
||||||
|
* field. See SharedDependencyType in catalog/dependency.h. |
||||||
|
*/ |
||||||
|
char deptype; /* see codes in dependency.h */ |
||||||
|
} FormData_pg_shdepend; |
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* Form_pg_shdepend corresponds to a pointer to a row with |
||||||
|
* the format of pg_shdepend relation. |
||||||
|
* ---------------- |
||||||
|
*/ |
||||||
|
typedef FormData_pg_shdepend *Form_pg_shdepend; |
||||||
|
|
||||||
|
/* ----------------
|
||||||
|
* compiler constants for pg_shdepend |
||||||
|
* ---------------- |
||||||
|
*/ |
||||||
|
#define Natts_pg_shdepend 6 |
||||||
|
#define Anum_pg_shdepend_dbid 1 |
||||||
|
#define Anum_pg_shdepend_classid 2 |
||||||
|
#define Anum_pg_shdepend_objid 3 |
||||||
|
#define Anum_pg_shdepend_refclassid 4 |
||||||
|
#define Anum_pg_shdepend_refobjid 5 |
||||||
|
#define Anum_pg_shdepend_deptype 6 |
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* pg_shdepend has no preloaded contents; system-defined dependencies are |
||||||
|
* loaded into it during a late stage of the initdb process. |
||||||
|
* |
||||||
|
* NOTE: we do not represent all possible dependency pairs in pg_shdepend; |
||||||
|
* for example, there's not much value in creating an explicit dependency |
||||||
|
* from a relation to its database. Currently, only dependencies on roles |
||||||
|
* are explicitly stored in pg_shdepend. |
||||||
|
*/ |
||||||
|
|
||||||
|
#endif /* PG_SHDEPEND_H */ |
@ -0,0 +1,39 @@ |
|||||||
|
-- |
||||||
|
-- DEPENDENCIES |
||||||
|
-- |
||||||
|
CREATE USER regression_user; |
||||||
|
CREATE USER regression_user2; |
||||||
|
CREATE USER regression_user3; |
||||||
|
CREATE GROUP regression_group; |
||||||
|
CREATE TABLE deptest (); |
||||||
|
GRANT SELECT ON TABLE deptest TO GROUP regression_group; |
||||||
|
GRANT ALL ON TABLE deptest TO regression_user, regression_user2; |
||||||
|
-- can't drop neither because they have privileges somewhere |
||||||
|
DROP USER regression_user; |
||||||
|
ERROR: role "regression_user" cannot be dropped because some objects depend on it |
||||||
|
DETAIL: access to table deptest |
||||||
|
DROP GROUP regression_group; |
||||||
|
ERROR: role "regression_group" cannot be dropped because some objects depend on it |
||||||
|
DETAIL: access to table deptest |
||||||
|
-- if we revoke the privileges we can drop the group |
||||||
|
REVOKE SELECT ON deptest FROM GROUP regression_group; |
||||||
|
DROP GROUP regression_group; |
||||||
|
-- can't drop the user if we revoke the privileges partially |
||||||
|
REVOKE SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ON deptest FROM regression_user; |
||||||
|
DROP USER regression_user; |
||||||
|
ERROR: role "regression_user" cannot be dropped because some objects depend on it |
||||||
|
DETAIL: access to table deptest |
||||||
|
-- now we are OK to drop him |
||||||
|
REVOKE TRIGGER ON deptest FROM regression_user; |
||||||
|
DROP USER regression_user; |
||||||
|
-- we are OK too if we drop the privileges all at once |
||||||
|
REVOKE ALL ON deptest FROM regression_user2; |
||||||
|
DROP USER regression_user2; |
||||||
|
-- can't drop the owner of an object |
||||||
|
ALTER TABLE deptest OWNER TO regression_user3; |
||||||
|
DROP USER regression_user3; |
||||||
|
ERROR: role "regression_user3" cannot be dropped because some objects depend on it |
||||||
|
DETAIL: owner of table deptest |
||||||
|
-- if we drop the object, we can drop the user too |
||||||
|
DROP TABLE deptest; |
||||||
|
DROP USER regression_user3; |
@ -0,0 +1,41 @@ |
|||||||
|
-- |
||||||
|
-- DEPENDENCIES |
||||||
|
-- |
||||||
|
|
||||||
|
CREATE USER regression_user; |
||||||
|
CREATE USER regression_user2; |
||||||
|
CREATE USER regression_user3; |
||||||
|
CREATE GROUP regression_group; |
||||||
|
|
||||||
|
CREATE TABLE deptest (); |
||||||
|
|
||||||
|
GRANT SELECT ON TABLE deptest TO GROUP regression_group; |
||||||
|
GRANT ALL ON TABLE deptest TO regression_user, regression_user2; |
||||||
|
|
||||||
|
-- can't drop neither because they have privileges somewhere |
||||||
|
DROP USER regression_user; |
||||||
|
DROP GROUP regression_group; |
||||||
|
|
||||||
|
-- if we revoke the privileges we can drop the group |
||||||
|
REVOKE SELECT ON deptest FROM GROUP regression_group; |
||||||
|
DROP GROUP regression_group; |
||||||
|
|
||||||
|
-- can't drop the user if we revoke the privileges partially |
||||||
|
REVOKE SELECT, INSERT, UPDATE, DELETE, RULE, REFERENCES ON deptest FROM regression_user; |
||||||
|
DROP USER regression_user; |
||||||
|
|
||||||
|
-- now we are OK to drop him |
||||||
|
REVOKE TRIGGER ON deptest FROM regression_user; |
||||||
|
DROP USER regression_user; |
||||||
|
|
||||||
|
-- we are OK too if we drop the privileges all at once |
||||||
|
REVOKE ALL ON deptest FROM regression_user2; |
||||||
|
DROP USER regression_user2; |
||||||
|
|
||||||
|
-- can't drop the owner of an object |
||||||
|
ALTER TABLE deptest OWNER TO regression_user3; |
||||||
|
DROP USER regression_user3; |
||||||
|
|
||||||
|
-- if we drop the object, we can drop the user too |
||||||
|
DROP TABLE deptest; |
||||||
|
DROP USER regression_user3; |
Loading…
Reference in new issue