Acredito que para ficar mais elegante ainda faria umas pequenas
alterações!!!

CREATE OR REPLACE FUNCTION change_owner(oldOWNER TEXT, newOWNER TEXT)
RETURNS boolean AS $$
DECLARE
  comando TEXT;
  lista   RECORD;
BEGIN
  comando := 'ALTER SCHEMA ' || quote_ident(oldOWNER) || ' OWNER TO ' ||
quote_ident(newOWNER);
  EXECUTE comando;

  FOR lista IN
    SELECT pg_namespace.nspname,
           pg_class.relname,
           pg_class.relkind
      FROM pg_namespace
           JOIN pg_class ON pg_namespace.oid=pg_class.relnamespace
     WHERE pg_namespace.nspname=oldOWNER
       AND pg_class.relkind IN ('r','v','S')
  LOOP
    IF lista.relkind = 'S' AND CAST((SELECT COALESCE(setting,0) FROM
pg_settings WHERE name = 'server_version_num') AS INTEGER) >= 80400 THEN
      comando := 'ALTER SEQUENCE ' || quote_ident(lista.nspname) || '.' ||
quote_ident(lista.relname) || ' OWNER TO ' || quote_ident(newOWNER);
      RAISE NOTICE '%', comando;
    ELSE
      comando := 'ALTER TABLE ' || quote_ident(lista.nspname) || '.' ||
quote_ident(lista.relname) || ' OWNER TO ' || quote_ident(newOWNER);

      RAISE NOTICE '%', comando;
    END IF;
    EXECUTE comando;
  END LOOP;

  IF FOUND THEN
    RETURN TRUE;
  END IF;
  RETURN FALSE;
END;
$$
LANGUAGE 'plpgsql'
IMMUTABLE
RETURNS FALSE ON NULL INPUT;

2009/9/4 Fabrízio de Royes Mello <[email protected]>

>
>
> 2009/9/4 JotaComm <[email protected]>
>
>> Olá,
>>
>> Segue a minha solução:
>>
>> CREATE OR REPLACE FUNCTION change_owner(TEXT,TEXT)
>> RETURNS boolean AS $$
>> DECLARE
>>   comando TEXT;
>>   lista RECORD;
>> BEGIN
>>   FOR lista IN
>>     SELECT pg_namespace.nspname,pg_class.relname,pg_class.relkind
>>     FROM pg_namespace JOIN pg_class ON
>> pg_namespace.oid=pg_class.relnamespace
>>     WHERE pg_namespace.nspname=$1
>>     AND pg_class.relkind IN (‘r’,‘v’,‘S’)
>>   LOOP
>>     IF lista.relkind=‘S’ THEN
>>       comando:=‘ALTER SEQUENCE ‘ || lista.relname || ‘ OWNER TO ‘ ||
>> quote_ident($2);
>>       RAISE NOTICE ‘‘, comando;
>>     ELSE
>>       comando:=‘ALTER TABLE ‘ || lista.relname || ‘ OWNER TO ‘ ||
>> quote_ident($2);
>>       RAISE NOTICE ‘‘, comando;
>>     END IF;
>>     EXECUTE comando;
>>   END LOOP;
>> IF FOUND THEN
>>   RETURN TRUE;
>> END IF;
>> RETURN FALSE;
>> END;
>> $$ LANGUAGE PLPGSQL;
>>
>
> Se me permites adicionar um "plus" e uns ajustes :
>
> * alterar o dono do schema passado por parametro
> * colocar o schema.tabela nos ALTER ...
> * compatibilidade com versoes menores que 8.4
>
> CREATE OR REPLACE FUNCTION change_owner(TEXT,TEXT)
> RETURNS boolean AS $$
> DECLARE
>   comando TEXT;
>   lista   RECORD;
> BEGIN
>   comando := 'ALTER SCHEMA ' || quote_ident($1) || ' OWNER TO ' ||
> quote_ident($2);
>   EXECUTE comando;
>
>   FOR lista IN
>     SELECT pg_namespace.nspname,
>            pg_class.relname,
>            pg_class.relkind
>       FROM pg_namespace
>            JOIN pg_class ON pg_namespace.oid=pg_class.relnamespace
>      WHERE pg_namespace.nspname=$1
>        AND pg_class.relkind IN ('r','v','S')
>   LOOP
>     IF lista.relkind = 'S' AND CAST((SELECT COALESCE(setting,0) FROM
> pg_settings WHERE name = 'server_version_num') AS INTEGER) >= 80400 THEN
>       comando := 'ALTER SEQUENCE ' || quote_ident(lista.nspname) || '.' ||
> quote_ident(lista.relname) || ' OWNER TO ' || quote_ident($2);
>       RAISE NOTICE '%', comando;
>     ELSE
>       comando := 'ALTER TABLE ' || quote_ident(lista.nspname) || '.' ||
> quote_ident(lista.relname) || ' OWNER TO ' || quote_ident($2);
>       RAISE NOTICE '%', comando;
>     END IF;
>     EXECUTE comando;
>   END LOOP;
>
>   IF FOUND THEN
>     RETURN TRUE;
>   END IF;
>   RETURN FALSE;
> END;
> $$ LANGUAGE plpgsql;
>
>
> Gostei bastante dessa sua solução Jota... qdo eu precisava eu rodava um
> script gerando as DDLs... assim fica mais elegante e prático...
>
>
> Cordialmente,
> --
> Fabrízio de Royes Mello
> >> Blog sobre TI: http://fabriziomello.blogspot.com
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>


-- 
Abraços......

Marcel Araujo
System Analyst
Developer Java/PHP/RIA
Linux User #490101
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a