Переименовать таблицу postGIS и обновить GeoServer?

9

Я хочу переименовать одну из моих таблиц postGIS. Тем не менее, когда я делаю это, применяя простой

ALTER TABLE old_name RENAME TO new_name;

Пространственные данные, насколько я понимаю, не обновляются с новым именем. Во-первых, можно ли исправить эти ссылки, запустив функцию:

SELECT probe_geometry_columns()

После этого сама таблица в порядке? Или должны быть приняты и другие меры? Во-вторых, как мне обновить GeoServer, чтобы он нашел эту новую таблицу? На данный момент, если я запускаю вышеуказанные команды и редактирую информацию слоя на GeoServer, чтобы указать новое имя ... Я все еще получаю сообщение об ошибке (GeoServer все еще пытается найти его под старым именем). Где именно следует изменить имя слоя на GeoServer?

Mimo
источник

Ответы:

4

Чтобы переименовать таблицу, вам придется изменить имя в метаданных двух мест. Сначала на PostGIS, затем на конфиге Geoserver.

Чтобы изменить PostGIS, вы можете напрямую обновлять geometry_columns. Хотя probe_geometries будет иметь эффект вставки этой записи в столбцы геометрии, он также будет иметь эффект ОПИСАНИЯ схемы всех таблиц вставкой любых пропущенных записей столбцов геометрии. Если у вас много таблиц, это может дорого обойтись, так почему бы просто не обновить таблицу geometry_columns напрямую?

Для обновления геосервера у вас есть различные варианты. Конечно, вы можете сделать это вручную через графический интерфейс, но у меня есть чувство, что вы хотите автоматизировать это. Написание сценария оболочки, который редактирует файлы конфигурации в папке установки геосервера и перезапускает геосервер, но это также долгий путь. Я бы порекомендовал вам использовать API конфигурации REST геосервера, который позволяет вам манипулировать конфигурациями слоев с помощью вызовов RESTful .

Обновить:

Если «обновить столбцы геометрии» неочевидно, сделайте следующее:

UPDATE geometry_columns set f_table_name = 'my_new_table_name' where f_table_name = 'my_old_table_name';

Обновление через 8 лет (!!!) (2018):

Как и некоторые люди, упомянутые ниже, после PostGIS 2.0 таблицы метаданных обновляются автоматически после оператора ALTER.

Раги Язер Бурхум
источник
Простите за мое невежество, но я очень новичок в PostGIS. Как именно я обновляю geometry_columns? Правильно ли я вас понял, что запуск функции probe_ (без каких-либо параметров) делает то же самое?
Мимо
1
Посмотрите на реализацию из probe_geometry_columns trac.osgeo.org/postgis/changeset/7548. Он просматривает каждую таблицу в БД, находит, содержит ли схема строку «geometrytype», и вставляет новую запись, если требуемая запись не существует. в geometry_columns. Тем не менее, бесхозные записи остались такими, какие они есть. Так почему бы просто не сделать: ОБНОВИТЬ geometry_columns SET f_table_name = 'new_table_name', где f_table_name = 'old_table_name'
Ragi Yaser Burhum
это показываетNot Found The requested URL /latest/en/user/restconfig/rest-config-api.html was not found on this server.
Scaramouche
Вы хотите посмотреть на это сейчас: docs.geoserver.org/stable/en/user/rest/api/index.html
Раги Язер Бурхум
7

Обратите внимание, что в PostGIS 2.0+ все, что вам нужно сделать, это нормально

ALTER TABLE old_name RENAME TO new_name;

Запись в представлении geometry_columns (или geography_columns) также будет обновлена.

Шейн
источник
3
SELECT Probe_Geometry_Columns();

это удобная утилита

Во-первых, когда мы добавляем столбец геометрии к существующей таблице с

SELECT AddGeometryColumn('my_table', 'geo_column', 1234, 'MULTIPOINT', 2);

мы передаем функции все, что ей нужно, чтобы привязать столбец типа geometry (geo_column) к указанной таблице (my_table) и записать важные детали, такие как SRID (1234), тип геометрии (MULTIPOINT) и количество измерений (2), в таблица geometry_columns. По сути, это ALTER и три ОБНОВЛЕНИЯ.

Создание геометрических столбцов другими средствами (загруженными из шейп-файла, выбранными в CREATE TABLE AS и т. Д.) Может привести к появлению пространственных таблиц, которые не будут видны внешним приложениям, хотя они отлично работают в базе данных. Без правильных деталей, сохраненных в geometry_columns, фактические значения геометрии отображаются как бессмысленные символьные строки для приложений, которые ищут проецируемые точки, линии или многоугольники.

Вызов функции-зонда проверяет каждый столбец типа geometry, добавляет новые значения в geometry_columns и сообщает о конфликтах.

Возвращаясь к вашему вопросу, GeoServer не верит, что переименованная таблица содержит пространственные данные, если изменение имени не отражено в geometry_columns. Еще нужно учесть, что функция зонда создает дублирующую запись, отражающую имя новой таблицы, но не избавляется от исходной записи - еще одно потенциальное зависание для GeoServer.

Все сказанное я бы посоветовал вам: 1) запустить зонд и сразу же удалить старую запись; или 2) проследите за изменением вашего имени с помощью ALTER для geometry_columns, чтобы изменить значение f_table_name.

Извините за многословность, но я надеюсь, что это поможет.

rec.thegeom
источник
Спасибо за ваш ответ. Я начинаю лучше понимать postGIS. Тем не менее, я немного не уверен в необходимых шагах, которые необходимо предпринять. Должен ли я сначала выполнить изменение имени, затем щуп ()? Как я могу изменить geometry_columns?
Мимо
Самый простой способ внести изменения в geometry_columns - это открыть pgAdmin, щелкнуть правой кнопкой мыши таблицу, выбрать просмотр данных, выбрать просмотр всех строк, щелкнуть ячейку со старым именем таблицы и ввести новое имя таблицы. или, ОБНОВИТЬ геометрия_колонки SET f_table_name = 'new_table_name' ГДЕ f_schema_name = 'schema_name' И f_table_name = 'old_table_name'
rec.thegeom
1

Я не уверен, что делает SELECT probe_geometry_columns (), но вы можете легко проверить таблицу geometry_columns, чтобы увидеть, есть ли там имя вашей новой таблицы или оно все еще указывает на старое.

Я подозреваю, что вам необходимо перезагрузить хранилище GeoServer, чтобы убедиться, что оно «замечает» изменения. Или остановка и запуск сделают это.

Ян Тертон
источник
Что вы подразумеваете под «перезагрузить магазин GeoServer»?
Мимо
На странице состояния ( docs.geoserver.org/latest/en/user/webadmin/server/status.html ) есть кнопка перезагрузки.
Ян Тертон
Спасибо. Однако перезагрузка не сработала. Я все еще получаю ошибку GeoServer, которая жалуется на отсутствие переименованного слоя. Он все еще пытается найти его под старым именем.
Мимо
Вы изменили определение слоя, чтобы указать новое имя таблицы?
Ян Тертон