Обсуждение: Best way to list a role’s owned objects?

Поиск
Список
Период
Сортировка

Best way to list a role’s owned objects?

От
Felipe Gasper
Дата:
Hi all,

    What is the best way to list a role’s owned objects in any database?

    My problem is that I need to be able to “FORCE DROP ROLE” by taking any
objects that that role owns, in any database, and reassigning them to
the “postgres” user.

    Even if REASSIGN OWNED BY worked for this purpose (it only works on the
current database), I would still need a way to display to the API caller
which objects were reassigned.

    Oh, and this preferably needs to work all the way back to PostgreSQL
8.1. :-<

    Any ideas?

    Thanks!

-Felipe Gasper
Houston, TX


Re: Best way to list a role’s owned objects?

От
John R Pierce
Дата:
On 7/1/2014 11:08 AM, Felipe Gasper wrote:
>     What is the best way to list a role’s owned objects in any database?

query pg_class in each database ?

--
john r pierce                                      37N 122W
somewhere on the middle of the left coast



Re: Best way to list a role’s owned objects?

От
Felipe Gasper
Дата:
On 7/1/14 1:13 PM, John R Pierce wrote:
> On 7/1/2014 11:08 AM, Felipe Gasper wrote:
>>     What is the best way to list a role’s owned objects in any database?
>
> query pg_class in each database ?
>

Every database on the cluster, individually, then? Is there no way to
query all databases at once?

I mean, *something* under the hood must be doing this because DROP ROLE
bugs out if the role owns anything in any DB.

-F


Re: Best way to list a roles owned objects?

От
Jerry Sievers
Дата:
Felipe Gasper <felipe@felipegasper.com> writes:

> On 7/1/14 1:13 PM, John R Pierce wrote:
>
>> On 7/1/2014 11:08 AM, Felipe Gasper wrote:
>>>     What is the best way to list a role’s owned objects in any database?
>>
>> query pg_class in each database ?
>>
>
> Every database on the cluster, individually, then? Is there no way to
> query all databases at once?
>
> I mean, *something* under the hood must be doing this because DROP
> ROLE bugs out if the role owns anything in any DB.

That is made possible by pg_shdepend catalog which makes note of shared
dependencies however it will *not*  inform you of what specific objects
are depending unless you visit each such DB to find out.

As for doing REASSIGN OWNED BY, as you mentioned earlier...

A better practice might be to create a special role on your cluster (say
orphaned_objects) and let this user take ownership of the depending
objects.

This makes possible for you to easily identify  such items later rather
then  have them mixed up with everything postgres owns.

The assumption is, that many of the things  so reassigned are quite
possibly junk, given that the real owner  has been dropped from the system.

>
> -F

--
Jerry Sievers
Postgres DBA/Development Consulting
e: postgres.consulting@comcast.net
p: 312.241.7800


Re: Best way to list a roles owned objects?

От
Jerry Sievers
Дата:
Jerry Sievers <gsievers19@comcast.net> writes:

> Felipe Gasper <felipe@felipegasper.com> writes:
>
>> On 7/1/14 1:13 PM, John R Pierce wrote:
>>
>>> On 7/1/2014 11:08 AM, Felipe Gasper wrote:
>>>>     What is the best way to list a role’s owned objects in any database?
>>>
>>> query pg_class in each database ?
>>>
>>
>> Every database on the cluster, individually, then? Is there no way to
>> query all databases at once?
>>
>> I mean, *something* under the hood must be doing this because DROP
>> ROLE bugs out if the role owns anything in any DB.
>
> That is made possible by pg_shdepend catalog which makes note of shared
> dependencies however it will *not*  inform you of what specific objects
> are depending unless you visit each such DB to find out.

Minor clarification...

You will get only OID data from pg_shdepend.  Assuming that this isn't
helpful for a human making a decision whether or not to drop a role and
all it's dependencies and/or reassign  them...

Symbolic information  will only be found in the related DB.

Furthermore,  you need to visit the related DB anyhow to run either of
DROP OWNED BY or REASSIGN OWNED BY.

HTH

>
> As for doing REASSIGN OWNED BY, as you mentioned earlier...
>
> A better practice might be to create a special role on your cluster (say
> orphaned_objects) and let this user take ownership of the depending
> objects.
>
> This makes possible for you to easily identify  such items later rather
> then  have them mixed up with everything postgres owns.
>
> The assumption is, that many of the things  so reassigned are quite
> possibly junk, given that the real owner  has been dropped from the system.
>
>>
>> -F
>
> --
> Jerry Sievers
> Postgres DBA/Development Consulting
> e: postgres.consulting@comcast.net
> p: 312.241.7800

--
Jerry Sievers
Postgres DBA/Development Consulting
e: postgres.consulting@comcast.net
p: 312.241.7800


Re: Best way to list a role s owned objects?

От
Tom Lane
Дата:
Jerry Sievers <gsievers19@comcast.net> writes:
> Felipe Gasper <felipe@felipegasper.com> writes:
>> Every database on the cluster, individually, then? Is there no way to
>> query all databases at once?
>> I mean, *something* under the hood must be doing this because DROP
>> ROLE bugs out if the role owns anything in any DB.

> That is made possible by pg_shdepend catalog which makes note of shared
> dependencies however it will *not*  inform you of what specific objects
> are depending unless you visit each such DB to find out.

Yeah.  You can identify the kind of object represented by each entry,
since classid values are common to all databases; but you can't resolve
any more information than that unless you connect to the DB in question.
This is because you can only "see" a given DB's system catalogs when
connected to that DB.

            regards, tom lane