HUFERSIL.WEBDEVELOPER

Reiniciando as sequences no PostgreSQL

Se você, como eu, usa muito o PostgreSQL, e de vez em quando precisa reiniciar as sequencias, vai uma dica de como fazer isso (testado no 9.0):

do $$
 
DECLARE
	rec RECORD;
	valor BIGINT;
BEGIN
	FOR REC IN SELECT  
		c.relname::text AS TABLE
		, f.attname::text AS FIELD
		, n.nspname::text AS schema
		, regexp_replace(CAST(d.adsrc AS TEXT), '.*?''(\w+)''.*?$'::TEXT, '\1'::TEXT, 'g'::TEXT) AS seq_name
 
		FROM pg_attribute f
		JOIN pg_class c ON c.oid = f.attrelid
		JOIN pg_type t ON t.oid = f.atttypid
		LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum
		LEFT JOIN pg_namespace n ON n.oid = c.relnamespace
		LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY ( p.conkey ) AND p.contype IN ('p')
		LEFT JOIN pg_constraint fk ON fk.conrelid = c.oid AND f.attnum = ANY ( fk.conkey ) AND fk.contype IN ('f')
		LEFT JOIN pg_class AS g ON fk.confrelid = g.oid
		WHERE c.relkind = 'r'::CHAR
			 AND f.attnum > 0
			 AND n.nspname = 'public'
			 AND p.contype = 'p'
			 AND SUBSTR(CAST(d.adsrc AS TEXT), 1, 7) = 'nextval'
	LOOP
		EXECUTE 'SELECT COALESCE(MAX('||rec.FIELD||'),0) + 1 FROM '||rec.TABLE INTO valor ;
		RAISE NOTICE 'Valor para %: % na sequence %', rec.TABLE, valor, rec.seq_name;
 
		PERFORM SETVAL(rec.seq_name, valor);
 
	END LOOP;
END
$$

@braços e fiquem com Deus!

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">