[Code: 0, SQL State: 0A000] when "typing" from pg_catalog

Started by Thiemo Kellneralmost 2 years ago7 messagesgeneral
Jump to latest
#1Thiemo Kellner
thiemo@gelassene-pferde.biz

Hi

I have the following function code. When trying to install, it gives me

[Code: 0, SQL State: 0A000] FEHLER: Verweise auf andere Datenbanken
sind nicht implementiert: pg_catalog.pg_roles.rolname
Position: 298 [Script position: 334 - 361]

To the best of my knowledge, pg_catalog is a schema not a database,
like information_schema. Am I missing something? And why is it not
allowed to type from the catalogue?

I presume, this example is rather academic due to the name type.

Kind regards

Thiemo

create or replace function GRANT_SELECTS()
returns void
language plpgsql
as
$body$
declare
C_SCHEMA_NAME constant
INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME%type :=
'snowrunner';
-- C_ROLE_NAME constant name :=
C_ROLE_NAME constant PG_CATALOG.PG_ROLES.ROLNAME :=
'snowrunner_reader';
V_SQL_STATEMENT text;
begin
-- Check the existance of the schema
perform 1
from INFORMATION_SCHEMA.SCHEMATA
where SCHEMA_NAME = C_SCHEMA_NAME;
if not found then
raise exception 'Schema "%s" does not exist!', C_SCHEMA_NAME;
end if;

-- Check the existance of the role
perform 1
from PG_CATALOG.PG_ROLES
where ROLNAME = C_ROLE_NAME;
if not found then
raise exception 'Role "%s" does not exist!', C_ROLE_NAME;
end if;

-- Issue grants
V_SQL_STATEMENT := format('grant select on all tables in schema
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
raise info '%', V_SQL_STATEMENT;
execute V_SQL_STATEMENT;
V_SQL_STATEMENT := format('grant select on all views in schema
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
raise info '%', V_SQL_STATEMENT;
execute V_SQL_STATEMENT;
V_SQL_STATEMENT := format('grant select on all materialized
views in schema %i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
raise info '%', V_SQL_STATEMENT;
execute V_SQL_STATEMENT;
commit;

return;
end;
$body$;

#2Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Thiemo Kellner (#1)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

On 4/9/24 07:59, Thiemo Kellner wrote:

Hi

I have the following function code. When trying to install, it gives me

[Code: 0, SQL State: 0A000]  FEHLER: Verweise auf andere Datenbanken
sind nicht implementiert: pg_catalog.pg_roles.rolname
  Position: 298  [Script position: 334 - 361]

[Code: 0, SQL State: 0A000] ERROR: References to other databases are not
implemented: pg_catalog.pg_roles.rolname
Position: 298 [Script position: 334 - 361]

To the best of my knowledge, pg_catalog is a schema not a database, like
information_schema. Am I missing something? And why is it not allowed to
type from the catalogue?

I presume, this example is rather academic due to the name type.

PG_CATALOG.PG_ROLES.ROLNAME := 'snowrunner_reader';

Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

Kind regards

Thiemo

create or replace function GRANT_SELECTS()
returns void
language plpgsql
as
$body$
    declare
        C_SCHEMA_NAME       constant
INFORMATION_SCHEMA.SCHEMATA.SCHEMA_NAME%type :=
          'snowrunner';
--        C_ROLE_NAME         constant    name :=
        C_ROLE_NAME         constant    PG_CATALOG.PG_ROLES.ROLNAME :=
          'snowrunner_reader';
        V_SQL_STATEMENT                 text;
    begin
        -- Check the existance of the schema
        perform 1
            from INFORMATION_SCHEMA.SCHEMATA
            where SCHEMA_NAME = C_SCHEMA_NAME;
        if not found then
            raise exception 'Schema "%s" does not exist!', C_SCHEMA_NAME;
        end if;

        -- Check the existance of the role
        perform 1
            from PG_CATALOG.PG_ROLES
            where ROLNAME = C_ROLE_NAME;
        if not found then
            raise exception 'Role "%s" does not exist!', C_ROLE_NAME;
        end if;

        -- Issue grants
        V_SQL_STATEMENT := format('grant select on all tables in schema
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
        raise info '%', V_SQL_STATEMENT;
        execute V_SQL_STATEMENT;
        V_SQL_STATEMENT := format('grant select on all views in schema
%i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
        raise info '%', V_SQL_STATEMENT;
        execute V_SQL_STATEMENT;
        V_SQL_STATEMENT := format('grant select on all materialized
views in schema %i to %i', C_SCHEMA_NAME, C_ROLE_NAME);
        raise info '%', V_SQL_STATEMENT;
        execute V_SQL_STATEMENT;
        commit;

        return;
    end;
$body$;

--
Adrian Klaver
adrian.klaver@aklaver.com

#3Thiemo Kellner
thiemo@gelassene-pferde.biz
In reply to: Adrian Klaver (#2)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

Thanks for taking this up.

Am 09.04.2024 um 17:09 schrieb Adrian Klaver:

On 4/9/24 07:59, Thiemo Kellner wrote:
[Code: 0, SQL State: 0A000] ERROR: References to other databases are not
implemented: pg_catalog.pg_roles.rolname
   Position: 298 [Script position: 334 - 361]

PG_CATALOG.PG_ROLES.ROLNAME := 'snowrunner_reader';

Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

Yes, obviously, but why? With the information_schema view all is fine.
And, I suppose, with all other objects in other schemas of the same
database too.

#4Adrian Klaver
adrian.klaver@aklaver.com
In reply to: Thiemo Kellner (#3)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

On 4/9/24 08:12, Thiemo Kellner wrote:

Thanks for taking this up.

Am 09.04.2024 um 17:09 schrieb Adrian Klaver:

On 4/9/24 07:59, Thiemo Kellner wrote:
[Code: 0, SQL State: 0A000] ERROR: References to other databases are
not implemented: pg_catalog.pg_roles.rolname
    Position: 298 [Script position: 334 - 361]

PG_CATALOG.PG_ROLES.ROLNAME := 'snowrunner_reader';

Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

Yes, obviously, but why? With the information_schema view all is fine.
And, I suppose, with all other objects in other schemas of the same
database too.

Because you did not do?:

PG_CATALOG.PG_ROLES.ROLNAME%type
--
Adrian Klaver
adrian.klaver@aklaver.com

#5Thiemo Kellner
thiemo@gelassene-pferde.biz
In reply to: Adrian Klaver (#4)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

Am 09.04.2024 um 17:18 schrieb Adrian Klaver:

Because you did not do?:

PG_CATALOG.PG_ROLES.ROLNAME%type

Oh, right. Sorry. What an oversight.

#6Thiemo Kellner
thiemo@gelassene-pferde.biz
In reply to: Adrian Klaver (#4)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

Am 09.04.2024 um 17:18 schrieb Adrian Klaver:

Because you did not do?:

PG_CATALOG.PG_ROLES.ROLNAME%type

Thanks

#7Tom Lane
tgl@sss.pgh.pa.us
In reply to: Adrian Klaver (#4)
Re: [Code: 0, SQL State: 0A000] when "typing" from pg_catalog

Adrian Klaver <adrian.klaver@aklaver.com> writes:

On 4/9/24 08:12, Thiemo Kellner wrote:

PG_CATALOG.PG_ROLES.ROLNAME := 'snowrunner_reader';

Is being seen as DB_NAME.TABLE_NAME.COLUMN_NAME.

No, it's being seen as DB_NAME.SCHEMA_NAME.TYPE_NAME.

Because you did not do?:
PG_CATALOG.PG_ROLES.ROLNAME%type

Exactly. The %type bit is important.

regards, tom lane