powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как изменить Domain в рабочей базе.
5 сообщений из 5, страница 1 из 1
Как изменить Domain в рабочей базе.
    #34953373
Michael BAG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть БД, домен "dtitle" типа character(150), который используется в некоторых таблицах. Можно ли все поля данного домена привести к формату character varying без потери данных? К великому сожалению, pgAdmin не дает возможность менять базовый тип данных домена... :(
...
Рейтинг: 0 / 0
Как изменить Domain в рабочей базе.
    #35244605
ZemA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недавно возникла подобная ситуация. Я ее решил правкой таблицы 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
Как изменить Domain в рабочей базе.
    #35247128
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем править pg_catalog ? по-моему достаточно alter table alter column type varchar, потом пересоздать dtitle и ещё раз alter table alter column type dtitle


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


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