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

Responder a