SQL

Знову почав мучити SQL i при записi об’єкту в базу SQL виникає помилка (“Поставщик данных или другая служба вернули состояние E_FAIL”).
В старiй версiї Ged все ок. Дякую.

Вiдповiдь: дана помилка виникла при записi в базу параметру CV (в якому було занесено весь список цiльового використання). Виправилось замiною на читання параметрiв з текстового файлу папки Lists (Маска: =@:CV.txt).

… все нормально, пiсля “вiдкрити SQL”, “зберегти SQL” почало працювати.

Доброго дня. При спробi створити об’єкт (Sqlmode=1) в логах postgres наступне:

EEST ERROR: function geometry(unknown, integer) does not exist at character 128
EEST HINT: No function matches the given name and argument types. You might need to add explicit type casts.
EEST STATEMENT: INSERT INTO _geom (ObjectID,LayerID,TS,NS,GRP,SO,Captions,Count,Area,Perimeter,Vector) VALUES (4,1006,315967492,0,0,0,‘’,2,0,0,geometry(‘LINESTRING(5507872.8771089 1333528.7743463 0.0000000,5507872.8771089 1333528.7743463 0.0000000)’,-1))

Дякую.

P.S. Система Ubuntu 9.1. Встановлено Postgres 8.3, PostGis 1.3.5 Geos 3.1.0

Доброго!
До недавнього часу в Digitals використовувались PostGIS-функції geometry() і st_astext(), але в версії PostGIS 2.х ці функції були замінені на st_geometryfromtext() і st_asewkt(). Нова версія Digitals адаптована під ці зміни, якщо версія PostGIS 1.х, то використовуються “старі” функції, інакше нові.

Версiя Digitals нова… Дякую.

Версiї до 2016 року працюють нормально, а з початку року - нi. Може причина в чомусь iншому, дякую.

Ви мали на увазi 2012-2013 р?
Postgis Release 2.0.0 Release date: 2012/04/03

i ще питання.

  1. В таблицi ‘_operations’ поле ‘op character(1)’ записується iнформацiя про дiї U,I,D - зрозумiло, а що означає S ?
  2. При використаннi SQLmode=1 (Postgis) не зберiгається вiдображення надписiв (довжини, номера точок i т.д.). Тобто можливо практичнiше використовувати звичайну базу (SQLmode=0) без доповнень? Чи є рiзниця i в чому мiж SQLmode=1 та SQLmode=0 (менший об’єм бази, швидкодiя, сумiснiсть з iншими продуктами, детальне налаштування прав користувачам до використання бази: об’єктiв, шарiв i т.д.).

Оновіть PostGIS, хоча б до 1.5. Зі старішими версіями Digitals в SQLmode=1 і не працював Availability: 1.5 - support for geography was introduced.

S - зміна структури таблиць, внаслідок маніпуляцій зі списком шарів/параметрів.

При SQLmode=1 геометрія зберігається в форматі OpenGIS, що дає можливість працювати з цими даним іншим програмам, таким як QuantumGIS.
При SQLmode=0 геометрія зберігається в нашому форматі, але зберігаються підписи.

… поки писав питання, забув написати, що версiя Postgis 1.5 i Postgresql 8.4. Вирiшив працювати з SQLmode=0 оскiльки форматування пiдписiв важливе для роботи (щоб кожного разу їх не перестворювати при вiдкриттi). Але питання з Postgis залишаю вiдкритим, оскiльки пробував на версiях Ged до 2016 року, де створюються записи в таблицi _geos, а в версiях Ged 2016 року виникають наступнi помилки:

В якiй послiдовностi заповнюються таблицi бази (хочу розподiлити можливостi запису i редагування об’єктiв мiж користувачами, щоб користувач мiг мiняти тiльки створенi ним об’єкти). Спочатку iде запис до таблицi об’єкту, а потiм данi про змiни заносяться в таблицю _operations, чи навпаки?

Дякую.

Пропали надписи дати зйомки на планi (p50000) а в базi даних ця колонка з даними змiнила iм’я на dp50000 i створилась нова - “пуста”. З яких причин? Дякую.

Нічого такого програма не повинна робити. Може якісь трігери?

… не знаю. Ось частина звiту з /var/log/postgresql/postgresql-8.4-main.log

[size=85]2016-05-31 16:01:32 EEST STATEMENT: INSERT INTO “objectdb”.“public”.“_layers” (“layerid”,“name”,“format”,“kind”,“state”,“symbolid”,“minscale”,“maxscale”,“pencolor”,“penwidth”,“penstyle”,“brushcolor”,“brushstyle”,“fontcolor”,“fontstyle”,“fontname”,“fontsize”,“reference”,“validparams”,“status”) VALUES (3012,E’Райавтодор (центр)‘,E’‘,1,3,9,0,1000000,8421504,0,1,16777215,1,0,0,E’Courier New’,80,8,0,16973824)
2016-05-31 16:04:09 EEST ERROR: column “p50000” of relation “l5003” already exists
2016-05-31 16:04:09 EEST STATEMENT: ALTER TABLE L5003 ADD COLUMN P50000 Text
2016-05-31 16:04:43 EEST ERROR: column “p50002” does not exist
2016-05-31 16:04:43 EEST STATEMENT: ALTER TABLE L5001 RENAME COLUMN p50002 TO Dp50002

2016-05-31 19:48:25 EEST STATEMENT: INSERT INTO “objectdb”.“public”.“_parameters” (“parameterid”,“name”,“format”,“kind”,“state”,“symbolid”,“minscale”,“maxscale”,“pencolor”,“penwidth”,“penstyle”,“brushcolor”,“brushstyle”,“fontcolor”,“fontstyle”,“fontname”,“fontsize”,“reference”,“validparams”,“status”) VALUES (-1000010,E’Довжини ліній[N]‘,E’‘,5,0,NULL,0,1000000,0,10,5,16777215,0,0,0,E’Arial Cyr’,50,0,0,83886112)
2016-05-31 19:49:53 EEST ERROR: column “dp50000” of relation “l5001” already exists
2016-05-31 19:49:53 EEST STATEMENT: ALTER TABLE L5001 RENAME COLUMN p50000 TO Dp50000
2016-05-31 20:13:37 EEST ERROR: column “p50000” of relation “l5001” already exists
2016-05-31 20:13:37 EEST STATEMENT: ALTER TABLE l5001 RENAME dp50000 TO p50000;[/size]

при оновленнi параметрiв шару (видалення чи добавляння) в базi iдуть наступнi команди:

[size=85]2016-05-31 20:41:31 EEST STATEMENT: DELETE FROM _Layers
2016-05-31 20:41:31 EEST STATEMENT: DELETE FROM _Layers

2016-05-31 20:41:31 EEST STATEMENT: DELETE FROM _Layers
(команда повторюється стiльки, скiльки є шарiв)
[/size]
… а потiм вставляються шари по новому
[size=85]2016-05-31 20:41:31 EEST STATEMENT: INSERT INTO “objectdb”.“public”.“_layers” (“layerid”,“name”,“format”,“kind”,“state”,“symbolid”,“minscale”,“maxscale”,“pencolor”,“penwidth”,“penstyle”,“brushcolor”,“brushstyle”,“fontcolor”,“fontstyle”,“fontname”,“fontsize”,“reference”,“validparams”,“status”) VALUES (-1000003,E’Рамка карты’,E’‘,1,0,NULL,0,1000000,65535,10,0,16777215,1,0,0,E’Courier New’,80,0,0,16777216)
… i .д.
[/size](деколи є i UPDATE, правда не замiтив, коли)
[size=85]2016-05-03 23:27:51 EEST STATEMENT: UPDATE “objectdb”.“public”.“_parameters” SET “parameterid”=-1000010,“name”=E’Довжини ліній[N]‘,“format”=E’‘,“kind”=5,“state”=0,“symbolid”=NULL,“minscale”=0,“maxscale”=1000000,“pencolor”=0,“penwidth”=10,“penstyle”=5,“brushcolor”=16777215,“brushstyle”=0,“fontcolor”=0,“fontstyle”=0,“fontname”=E’Arial Cyr’,“fontsize”=50,“reference”=0,“validparams”=0,“status”=83886112 WHERE “parameterid”=-1000010 AND “name”=E’Довжини ліній[N]’ AND “format”=E’’ AND “kind”=5 AND “state”=0 AND “symbolid” IS NULL AND “minscale”=0 AND “maxscale”=1000000 AND “pencolor”=0 AND “penwidth”=10 AND “penstyle”=5 AND “brushcolor”=16777215 AND “brushstyle”=0 AND “fontcolor”=0 AND “fontstyle”=0 AND “fontname”=E’Arial Cyr’ AND “fontsize”=50 AND “reference”=0 AND “validparams”=0 AND “status”=83886112[/size]

не могу разобраться в настройках Сервера:
при настройке коннекта через файл SQL.udl все пишет ОК:
http://prntscr.com/mbwu0i
в Диджитале при соединении с БД оно лезет не в тот каталог что я указывал при тесте:
http://prntscr.com/mbww49
и как реализовать переключение между БД? (скрипт, дополнение)Попробовал создать на целый район БД, то недостаточно памяти. Хочу разбить по С/Р (на подобие работы кадастровой карты через выплывающее меню)
Может чего-то я не допонимаю? :laughing:

для соединения с Postgresql данное поле в udl-файле не играет роли, его можно не задавать вообще.
А вот в свойствах ODBC-источника задавать “Database” необходимо.
Можно создать несколько источников данных, ссылающихся на разные БД
[attachment=0]ODBC_DB.png[/attachment]

с Горем пополам настроили Сервер. Даже работает. :laughing:
Кстати не ожидал такой шустрости БД при работе с количеством объектов больше чем 1 000 000.
При создании резервных копий понял что то-то делаю не так, ибо после падения сервака рэсторе ничего не дало.
Что значат по отдельности бэкапы сиих http://prntscr.com/mjm8st каталогов и схем. Стоит ли их все делать? Или достаточно выбрать один бэкапщик толковый и не заморачиваться.?

В контекстном меню какой-либо базы в PGAdmin есть пункт Backup. Этот пункт меню для создания резервной копии всей базы.

Чи можна прибрати дане повiдомлення (колись його не було). У моєму випадку при роботi з базою для певних користувачiв заборонено змiнювати параметри деяких таблиць (зйомочних точок) за допомогою тригерної функцiї, чи є якiсь iншi варiанти для цього. Дякую.

Можливо Ви перекрили наш трігер, на кожен шар (таблицю в БД) створюється три тригера на усі події, фактично ведення лога операцій в таблиці _operations. Доповніть ці трігери.
У випадку бази PostGIS (SQLMode=1) можна окремо для геометрії (вся геометрия в таблиці _geom) окремо для семантики (таблиці Lxxx, де xxx - айді шару) можна надавати різні права користувачам за допомогою Grant wisard у PGAdmin, або SQL-команди GRANT

Це я зрозумiв, але як менi заборонити запис на деякi таблицi (i вiдповiдно до логу, бо запису не буде). Я створюю також трiгер на кожну з таблиць, в якому прописую наступнеCREATE TRIGGER check_add_reclayer BEFORE INSERT OR UPDATE OR DELETE ON l11320000 FOR EACH ROW EXECUTE PROCEDURE check_add_reclayer(); ну i сама функцiя обробки CREATE OR REPLACE FUNCTION check_add_reclayer() RETURNS trigger AS $BODY$ BEGIN IF (TG_OP = 'DELETE') THEN IF (current_user != OLD.login AND current_user != 'postgres' AND current_user != 'gis_admin') THEN RETURN NULL; ELSE RETURN OLD; END IF; ELSEIF (TG_OP = 'UPDATE') THEN IF (current_user != OLD.login AND current_user != 'postgres' AND current_user != 'gis_admin') THEN RETURN NULL; ELSE --ELSEIF (current_user = 'postgres' OR current_user = 'gis_admin') THEN NEW.login := current_user; NEW.p9000 := current_user; RETURN NEW; END IF; ELSEIF (TG_OP = 'INSERT') THEN NEW.login := current_user; NEW.p9000 := current_user; RETURN NEW; END IF; RETURN NULL; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION check_add_reclayer() OWNER TO postgres;
чи менi у кодiCREATE OR REPLACE FUNCTION l11320000_insert_func() RETURNS trigger AS $BODY$ DECLARE BEGIN INSERT INTO _operations(ln, objid, op, uid) VALUES( 11320000, new.objectid, 'I'::bpchar, pg_backend_pid()); RETURN NEW; END; $BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION l11320000_insert_func() OWNER TO postgres; перед INSERT робити перевiрку, i давати (забороняти) дозвiл користувачу на вставку, але що тодi записувати в таблицю _operations? Якщо нiчого не записувати, тодi знову буде вискакувати дана помилка, чи я щось не так розумiю. Дякую.

P.S. Якщо вставити в свою ф-цiю запис до таблицi operations (INSERT INTO _operations(ln, objid, op, uid)) для Insert, Update та Delete i витерти стандартнi тригери для обробки подiй, чи так буде вiрно?