Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменить Domain в рабочей базе. / 5 сообщений из 5, страница 1 из 1
20.11.2007, 19:26
    #34953373
Michael BAG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить Domain в рабочей базе.
Есть БД, домен "dtitle" типа character(150), который используется в некоторых таблицах. Можно ли все поля данного домена привести к формату character varying без потери данных? К великому сожалению, pgAdmin не дает возможность менять базовый тип данных домена... :(
...
Рейтинг: 0 / 0
09.04.2008, 10:43
    #35244605
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить Domain в рабочей базе.
Недавно возникла подобная ситуация. Я ее решил правкой таблицы pg_catalog.pg_type :)
Могу предложить вам такой скрипт
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
begin;

create domain dtitle_new as varchar;

update pg_catalog.pg_type
set
	typoutput=new_type.typoutput,
	typsend=new_type.typsend,
	typbasetype=new_type.typbasetype,
	typtypmod=new_type.typtypmod
from pg_catalog.pg_type as new_type
where pg_catalog.pg_type.typname = 'dtitle'
and new_type.typname = 'dtitle_new';

CREATE OR REPLACE FUNCTION update_dtitle()
  RETURNS void AS
$BODY$
declare
	rec record;
	sql text;
begin
	for rec in
		select
			quote_ident(table_schema) as table_schema,
			quote_ident(table_name) as table_name,
			array_to_string(
				array_accum(column_name || '=trim(' || column_name || ')'),
				', '
			) as set_fields
		from (
			select
				t.table_schema,
				t.table_name,
				quote_ident(c.column_name) as column_name
			from information_schema.tables t
			join information_schema.columns c using (table_catalog, table_schema, table_name)
			where t.table_type='BASE TABLE'
			and c.domain_name = 'dtitle'
		) q
		group by table_schema, table_name
		order by table_schema, table_name
	loop
		sql := 'update ' || rec.table_schema || '.' || rec.table_name || ' set ' || rec.set_fields || ';';
		raise notice '%', sql;
		execute sql;
	end loop;
	return;
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

drop domain dtitle_new;
drop FUNCTION update_dtitle();

commit;
...
Рейтинг: 0 / 0
10.04.2008, 09:43
    #35247128
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить Domain в рабочей базе.
а зачем править pg_catalog ? по-моему достаточно alter table alter column type varchar, потом пересоздать dtitle и ещё раз alter table alter column type dtitle


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
10.04.2008, 12:26
    #35247809
ZemA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить Domain в рабочей базе.
если одна таблица то да, а если несколько + куча хранимок и т.д.?
...
Рейтинг: 0 / 0
10.04.2008, 17:19
    #35249249
sergomor
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как изменить Domain в рабочей базе.
я делал так:
сначала pg_dump
потом drop database
потом create database - создаем новую базу
потом create domain dtitle as varchar - создаем домен для нового типа
затем востанавливаем базу из дампа pg_restore
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменить Domain в рабочей базе. / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]