mirror of
https://git.postgresql.org/git/postgresql.git
synced 2025-01-30 19:00:29 +08:00
ALTER DOMAIN OWNER, from Rod Taylor.
This commit is contained in:
parent
1bf1597e3a
commit
daec989f6a
@ -1,5 +1,5 @@
|
||||
<!--
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_domain.sgml,v 1.6 2002/12/06 16:40:13 momjian Exp $
|
||||
$Header: /cvsroot/pgsql/doc/src/sgml/ref/alter_domain.sgml,v 1.7 2003/01/06 00:31:44 tgl Exp $
|
||||
PostgreSQL documentation
|
||||
-->
|
||||
|
||||
@ -29,6 +29,8 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
ADD <replaceable class="PARAMETER">domain_constraint</replaceable>
|
||||
ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
DROP CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> [ RESTRICT | CASCADE ]
|
||||
ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
OWNER TO <replaceable class="PARAMETER">new_owner</replaceable>
|
||||
</synopsis>
|
||||
|
||||
<refsect2 id="R2-SQL-ALTERDOMAIN-1">
|
||||
@ -73,7 +75,7 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
<term>CASCADE</term>
|
||||
<listitem>
|
||||
<para>
|
||||
Automatically drop objects that depend constraint.
|
||||
Automatically drop objects that depend on the constraint.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -88,6 +90,15 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term><replaceable class="PARAMETER">new_owner</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
The user name of the new owner of the domain.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
</variablelist>
|
||||
</para>
|
||||
</refsect2>
|
||||
@ -141,9 +152,9 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
<term>SET/DROP DEFAULT</term>
|
||||
<listitem>
|
||||
<para>
|
||||
These forms set or remove the default value for a column. Note
|
||||
These forms set or remove the default value for a domain. Note
|
||||
that defaults only apply to subsequent <command>INSERT</command>
|
||||
commands; they do not cause rows already in a table using the domain.
|
||||
commands; they do not affect rows already in a table using the domain.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -154,8 +165,7 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
<para>
|
||||
These forms change whether a domain is marked to allow NULL
|
||||
values or to reject NULL values. You may only <literal>SET NOT NULL</>
|
||||
when the tables using the domain contain no null values in the domain
|
||||
based column.
|
||||
when the columns using the domain contain no null values.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -164,8 +174,10 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
<term>ADD <replaceable class="PARAMETER">domain_constraint</replaceable></term>
|
||||
<listitem>
|
||||
<para>
|
||||
This form adds a new constraint to a table using the same syntax as
|
||||
<xref linkend="SQL-CREATEDOMAIN" endterm="SQL-CREATEDOMAIN-TITLE">.
|
||||
This form adds a new constraint to a domain using the same syntax as
|
||||
<xref linkend="SQL-CREATEDOMAIN" endterm="SQL-CREATEDOMAIN-TITLE">.
|
||||
This will only succeed if all columns using the domain satisfy the
|
||||
new constraint.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
@ -179,11 +191,19 @@ ALTER DOMAIN <replaceable class="PARAMETER">domain</replaceable>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
|
||||
<varlistentry>
|
||||
<term>OWNER</term>
|
||||
<listitem>
|
||||
<para>
|
||||
This form changes the owner of the domain to the specified user.
|
||||
</para>
|
||||
</listitem>
|
||||
</varlistentry>
|
||||
</variablelist>
|
||||
|
||||
<para>
|
||||
You must own the domain to use <command>ALTER DOMAIN</>; except for
|
||||
<command>ALTER TABLE OWNER</>, which may only be executed by a superuser.
|
||||
<command>ALTER DOMAIN OWNER</>, which may only be executed by a superuser.
|
||||
</para>
|
||||
</refsect1>
|
||||
|
||||
|
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.26 2003/01/04 00:46:08 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/commands/typecmds.c,v 1.27 2003/01/06 00:31:44 tgl Exp $
|
||||
*
|
||||
* DESCRIPTION
|
||||
* The "DefineFoo" routines take the parse tree and pick out the
|
||||
@ -1673,3 +1673,61 @@ domainAddConstraint(Oid domainOid, Oid domainNamespace, Oid baseTypeOid,
|
||||
*/
|
||||
return ccbin;
|
||||
}
|
||||
|
||||
/*
|
||||
* ALTER DOMAIN .. OWNER TO
|
||||
*
|
||||
* Eventually this should allow changing ownership of other kinds of types,
|
||||
* but some thought must be given to handling complex types. (A table's
|
||||
* rowtype probably shouldn't be allowed as target, but what of a standalone
|
||||
* composite type?)
|
||||
*
|
||||
* Assumes that permission checks have been completed earlier.
|
||||
*/
|
||||
void
|
||||
AlterTypeOwner(List *names, AclId newOwnerSysId)
|
||||
{
|
||||
TypeName *typename;
|
||||
Oid typeOid;
|
||||
Relation rel;
|
||||
HeapTuple tup;
|
||||
Form_pg_type typTup;
|
||||
|
||||
/* Make a TypeName so we can use standard type lookup machinery */
|
||||
typename = makeNode(TypeName);
|
||||
typename->names = names;
|
||||
typename->typmod = -1;
|
||||
typename->arrayBounds = NIL;
|
||||
|
||||
/* Lock the type table */
|
||||
rel = heap_openr(TypeRelationName, RowExclusiveLock);
|
||||
|
||||
/* Use LookupTypeName here so that shell types can be processed (why?) */
|
||||
typeOid = LookupTypeName(typename);
|
||||
if (!OidIsValid(typeOid))
|
||||
elog(ERROR, "Type \"%s\" does not exist",
|
||||
TypeNameToString(typename));
|
||||
|
||||
tup = SearchSysCacheCopy(TYPEOID,
|
||||
ObjectIdGetDatum(typeOid),
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(tup))
|
||||
elog(ERROR, "AlterDomain: type \"%s\" does not exist",
|
||||
TypeNameToString(typename));
|
||||
typTup = (Form_pg_type) GETSTRUCT(tup);
|
||||
|
||||
/* Check that this is actually a domain */
|
||||
if (typTup->typtype != 'd')
|
||||
elog(ERROR, "%s is not a domain",
|
||||
TypeNameToString(typename));
|
||||
|
||||
/* Modify the owner --- okay to scribble on typTup because it's a copy */
|
||||
typTup->typowner = newOwnerSysId;
|
||||
|
||||
simple_heap_update(rel, &tup->t_self, tup);
|
||||
|
||||
CatalogUpdateIndexes(rel, tup);
|
||||
|
||||
/* Clean up */
|
||||
heap_close(rel, RowExclusiveLock);
|
||||
}
|
||||
|
@ -11,7 +11,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.389 2002/12/30 15:31:47 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/parser/gram.y,v 2.390 2003/01/06 00:31:44 tgl Exp $
|
||||
*
|
||||
* HISTORY
|
||||
* AUTHOR DATE MAJOR EVENT
|
||||
@ -3764,6 +3764,15 @@ AlterDomainStmt:
|
||||
n->behavior = $7;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
/* ALTER DOMAIN <domain> OWNER TO UserId */
|
||||
| ALTER DOMAIN_P any_name OWNER TO UserId
|
||||
{
|
||||
AlterDomainStmt *n = makeNode(AlterDomainStmt);
|
||||
n->subtype = 'U';
|
||||
n->typename = $3;
|
||||
n->name = $6;
|
||||
$$ = (Node *)n;
|
||||
}
|
||||
;
|
||||
|
||||
opt_as: AS {}
|
||||
|
@ -10,7 +10,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.187 2002/12/30 18:42:16 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/utility.c,v 1.188 2003/01/06 00:31:44 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -439,11 +439,11 @@ ProcessUtility(Node *parsetree,
|
||||
stmt->newname); /* new att name */
|
||||
break;
|
||||
case RENAME_RULE:
|
||||
elog(ERROR, "ProcessUtility: Invalid target for RENAME: %d",
|
||||
elog(ERROR, "ProcessUtility: Invalid type for RENAME: %d",
|
||||
stmt->renameType);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "ProcessUtility: Invalid target for RENAME: %d",
|
||||
elog(ERROR, "ProcessUtility: Invalid type for RENAME: %d",
|
||||
stmt->renameType);
|
||||
}
|
||||
}
|
||||
@ -553,7 +553,8 @@ ProcessUtility(Node *parsetree,
|
||||
get_usesysid(stmt->name));
|
||||
break;
|
||||
default: /* oops */
|
||||
elog(ERROR, "T_AlterTableStmt: unknown subtype");
|
||||
elog(ERROR, "ProcessUtility: Invalid type for AlterTableStmt: %d",
|
||||
stmt->subtype);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -595,8 +596,17 @@ ProcessUtility(Node *parsetree,
|
||||
stmt->name,
|
||||
stmt->behavior);
|
||||
break;
|
||||
case 'U': /* OWNER TO */
|
||||
/* check that we are the superuser */
|
||||
if (!superuser())
|
||||
elog(ERROR, "ALTER DOMAIN: permission denied");
|
||||
/* get_usesysid raises an error if no such user */
|
||||
AlterTypeOwner(stmt->typename,
|
||||
get_usesysid(stmt->name));
|
||||
break;
|
||||
default: /* oops */
|
||||
elog(ERROR, "T_AlterDomainStmt: unknown subtype");
|
||||
elog(ERROR, "ProcessUtility: Invalid type for AlterDomainStmt: %d",
|
||||
stmt->subtype);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -7,15 +7,17 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: typecmds.h,v 1.2 2002/12/10 16:12:53 tgl Exp $
|
||||
* $Id: typecmds.h,v 1.3 2003/01/06 00:31:44 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef TYPECMDS_H
|
||||
#define TYPECMDS_H
|
||||
|
||||
#include "miscadmin.h"
|
||||
#include "nodes/parsenodes.h"
|
||||
|
||||
|
||||
#define DEFAULT_TYPDELIM ','
|
||||
|
||||
extern void DefineType(List *names, List *parameters);
|
||||
@ -31,4 +33,6 @@ extern void AlterDomainAddConstraint(List *names, Node *constr);
|
||||
extern void AlterDomainDropConstraint(List *names, const char *constrName,
|
||||
DropBehavior behavior);
|
||||
|
||||
extern void AlterTypeOwner(List *names, AclId newOwnerSysId);
|
||||
|
||||
#endif /* TYPECMDS_H */
|
||||
|
@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $Id: parsenodes.h,v 1.224 2002/12/30 15:31:51 momjian Exp $
|
||||
* $Id: parsenodes.h,v 1.225 2003/01/06 00:31:45 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -711,7 +711,7 @@ typedef struct AlterTableStmt
|
||||
* Alter Domain
|
||||
*
|
||||
* The fields are used in different ways by the different variants of
|
||||
* this command. Subtypes should match AlterTable subtypes
|
||||
* this command. Subtypes should match AlterTable subtypes where possible.
|
||||
* ----------------------
|
||||
*/
|
||||
typedef struct AlterDomainStmt
|
||||
|
Loading…
Reference in New Issue
Block a user