mirror of
https://github.com/postgres/postgres.git
synced 2025-05-03 22:24:49 +03:00
Update release notes to show how to upgrade a database to use the new
early binding for nextval() calls in default clauses.
This commit is contained in:
parent
6a17577933
commit
07e74305fe
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.381 2005/10/02 23:50:06 tgl Exp $
|
$PostgreSQL: pgsql/doc/src/sgml/release.sgml,v 1.382 2005/10/03 01:57:59 momjian Exp $
|
||||||
|
|
||||||
Typical markup:
|
Typical markup:
|
||||||
|
|
||||||
@ -262,6 +262,21 @@ pg_[A-Za-z0-9_] <application>
|
|||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
<varname>Add proper sequence function dependencies (Tom)
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
In previous releases, <function>nextval()</>,
|
||||||
|
<function>currval</>, and <function>setval()</> recorded
|
||||||
|
sequence names as simple text strings, meaning that renaming or
|
||||||
|
dropping a sequence used in a <command>DEFAULT</> made the
|
||||||
|
clause invalid. This release stores all newly-created sequence
|
||||||
|
function arguments using internal oids, allowing them to handle
|
||||||
|
sequence renaming, and adding dependency information that
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
<varname>add_missing_from</> is now false by default (Neil)
|
<varname>add_missing_from</> is now false by default (Neil)
|
||||||
@ -398,16 +413,53 @@ pg_[A-Za-z0-9_] <application>
|
|||||||
</para>
|
</para>
|
||||||
<para>
|
<para>
|
||||||
When an expression like <literal>nextval('myseq')</> appears in a
|
When an expression like <literal>nextval('myseq')</> appears in a
|
||||||
column default expression or view, the referenced sequence (here
|
column <command>DEFAULT</> expression or view, the referenced
|
||||||
<literal>myseq</>) is now looked up immediately, and its pg_class
|
sequence (here <literal>myseq</>) is now looked up immediately,
|
||||||
OID is placed in the stored expression. This representation will
|
and its pg_class OID is placed in the stored expression. This
|
||||||
survive renaming of the referenced sequence, as well as changes in
|
representation will survive renaming of the referenced sequence,
|
||||||
schema search paths. The system also understands that the sequence
|
as well as changes in schema search paths. The system also
|
||||||
reference represents a dependency, so the sequence cannot be dropped
|
understands that the sequence reference represents a dependency,
|
||||||
without dropping the referencing object. To get the old behavior of
|
so the sequence cannot be dropped without dropping the
|
||||||
run-time lookup of the sequence by name, cast the argument to
|
referencing object. Previous releases stored this information as
|
||||||
<type>text</>, for example <literal>nextval('myseq'::text)</>.
|
a simple text string, with none of the benefits outlined above.
|
||||||
|
To get the old text-based behavior of run-time lookup of the
|
||||||
|
sequence name, cast the argument to <type>text</>, for example
|
||||||
|
<literal>nextval('myseq'::text)</>.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
Pre-8.1 schemas loaded into 8.1 will use the previous, text-based
|
||||||
|
representation and therefore will not have these protections.
|
||||||
|
However, it is possible to upgrade a database to the newer
|
||||||
|
OID-based arguments. First, save this query into a file, such as
|
||||||
|
<filename>fixseq.sql</>:
|
||||||
|
<programlisting>
|
||||||
|
SELECT 'ALTER TABLE ' ||
|
||||||
|
pg_catalog.quote_ident(n.nspname) || '.' ||
|
||||||
|
pg_catalog.quote_ident(c.relname) ||
|
||||||
|
' ALTER COLUMN ' || pg_catalog.quote_ident(a.attname) ||
|
||||||
|
' SET DEFAULT ' ||
|
||||||
|
regexp_replace(d.adsrc, '(nextval\\(''[^'']*'')::text', '\\1', 'g') ||
|
||||||
|
';'
|
||||||
|
FROM pg_namespace n, pg_class c, pg_attribute a, pg_attrdef d
|
||||||
|
WHERE n.oid = c.relnamespace AND
|
||||||
|
c.oid = a.attrelid AND
|
||||||
|
a.attrelid = d.adrelid AND
|
||||||
|
a.attnum = d.adnum AND
|
||||||
|
d.adsrc ~ '.*nextval\\(''[^'']*''::text';
|
||||||
|
</programlisting>
|
||||||
|
Next, run the query against a database to find what
|
||||||
|
adjustments are required, like this for database <literal>db1</>:
|
||||||
|
<programlisting>
|
||||||
|
psql -aT -f fixseq.sql db1
|
||||||
|
</programlisting>
|
||||||
|
This will show the <command>ALTER TABLE</> commands needed to
|
||||||
|
convert the database to the newer OID-based representation.
|
||||||
|
Finally, run this to update the database:
|
||||||
|
<programlisting>
|
||||||
|
psql -aT -f fixseq.sql db1 | psql -e db1
|
||||||
|
</programlisting>
|
||||||
|
This process should be done for each database loaded with pre-8.1
|
||||||
|
schemas.
|
||||||
</listitem>
|
</listitem>
|
||||||
|
|
||||||
<listitem>
|
<listitem>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user