powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение полей в таблице из другой БД.
20 сообщений из 45, страница 2 из 2
Заполнение полей в таблице из другой БД.
    #38633612
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовПри добавлении записей в исходную таблицу и попытке их сохранить выдается ошибка.как добавляете, как сохраняете, DDL исходной таблицы

скорее всего нужно изменить тип триггера на AFTER
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634375
Тип триггера изменил на AFTERб все равно сохранилась эта ошибка

авторОшибки источника:
Ошибка PostGIS при добавлении объектов: ОШИБКА: оператор не уникален: text || geometry
СТРОКА 1: ...tkey TEXT, objectid TEXT) values ('||NEW.id||','''||NEW.the_...
^
ПОДСКАЗКА: Не удалось выбрать лучшую кандидатуру оператора. Возможно, вам следует добавить явные преобразования типов.
ЗАПРОС: SELECT dblink_exec('insert into dorojnaya_set(id_0 INTEGER, the_geom geometry, objectcode TEXT, objectkey TEXT, objectid TEXT) values ('||NEW.id||','''||NEW.the_geom||''','''||NEW.objectcode||''','''||NEW.objectkey||''','''||NEW.objectcid||''');')
КОНТЕКСТ: функция PL/pgSQL dorojnaya_set1_update(), строка 4, оператор PERFORM

Пытаюсь типы явно определить
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE FUNCTION dorojnaya_set1_update()
  RETURNS trigger AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=192.168.50.111 port=5432 dbname=topo2000 user=alimuradov password=5vn63ys9');
	 perform dblink_exec('insert into dorojnaya_set(id_0 INTEGER, the_geom GEOMETRY, objectcode TEXT, objectkey TEXT, objectid TEXT) values ('||NEW.id||','''||NEW.the_geom||''','''||NEW.objectcode||''','''||NEW.objectkey||''','''||NEW.objectcid||''');');	
         perform dblink_disconnect(); 
       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION dorojnaya_set1_update()
  OWNER TO gisgroup;



Не помогает =(((
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634593
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов,

расскажите ПЖ, что вы хотите передать текст, а не сконкатенировать геометрию
т.е. задайте явное приведение к строчному типу

Код: sql
1.
...||NEW.the_geom::text||...
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634602
Нариман Алимурадов,

вставляю запись из gui pgadmin
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634606
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и даже как-то так (свернули-развернули)
Код: sql
1.
...||NEW.the_geom::text||'''::GEOMETRY,'''...


а еще лучше юзать quote_nullable (NEW.the_geom::text), и варьировать $$-квотинг с ''''-квотингом
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634610
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовНариман Алимурадов,

вставляю запись из gui pgadmin
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634669
Переписал так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE OR REPLACE FUNCTION dorojnaya_set1_update()
  RETURNS trigger AS
$BODY$
   BEGIN 
         perform dblink_connect('hostaddr=192.168.50.111 port=5432 dbname=db user=user password=password');
	 perform dblink_exec('insert into dorojnaya_set(id_0, the_geom, objectcode, objectkey, objectid) values ('||NEW.id::text||'::TEXT,'''||NEW.the_geom::text||'''::GEOMETRY,'''||NEW.objectcode::text||'''::TEXT,'''||NEW.objectkey::text||'''::TEXT,'''||NEW.objectid::text||'''::TEXT);'); 	
         perform dblink_disconnect(); 
       RETURN NEW;
   END;
$BODY$




теперь ошибка вставки не выдаетс, но записи не переходят в другую таблицу.
Если выполняю просто dblink с параметрами подключения, то соеднинение устанавливается и я получаю OK.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634683
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовТип триггера изменил на AFTER все равно сохранилась эта ошибкая говорил о предыдущем варианте с NEW.id_0
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634773
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Нариман Алимурадов, начните с документации . цирк какой-то.
Код: plsql
1.
perform dblink_exec(format('insert into dorojnaya_set (id_0, the_geom, objectcode, objectkey, objectid) values (%s, CAST(%L AS geometry), %L, %L, %L)', new.id_0, new.the_geom, new.objectcode, new.objectkey, new.objectid));
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38634801
V&N,
Спасибо Вам большое добрый человек. Наконец то получилось.

Код: plaintext
Мне легче отталкиваться на работающих примерах, чем курить документацию. 
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38635202
V&N, странно что, помимо полей указанных непосредственно, также происходит вставка и других полей, которые в триггере не отмечены явно.
Так например, если в таблице
Код: sql
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.
CREATE TABLE dorojnaya_set
(
  id integer NOT NULL DEFAULT nextval('dorojnaya_set_id_0_seq'::regclass),
  the_geom geometry(MultiPolygon,900920),
  sem32768 character varying(254),
  sem32769 character varying(254),
  sem9 character varying(254),
  sem11 numeric,
  sem97 character varying(64),
  sem4 numeric,
  sem31 character varying(64),
  sem3 character varying(64),
  sem40 character varying(64),
  sem51 numeric,
  sem54 character varying(64),
  sem250 character varying(254),
  sem90 character varying(64),
  sem1 numeric,
  sem55 character varying(64),
  sem10 character varying(64),
  sem57 character varying(64),
  sem84 character varying(64),
  sem44 character varying(64),
  sem46 numeric,
  sem50 numeric,
  sem53 numeric,
  sem208 numeric,
  sem210 numeric,
  sem35 character varying(64),
  sem21 character varying(64),
  objectcode character varying(24),
  objectkey character varying(64),
  objectid character varying(24),
  objectname character varying(254),
  CONSTRAINT dorojnaya_set_pkey PRIMARY KEY (id )
)



Я заполню, еще и поля не указанные в триггерной функции, то и они перенесутся в другую БД в соответствующие поля таблицы.
Вставка осуществляется в клиентском приложении.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38635538
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов,

Так не бывает.
Вы что то не так делаете или не там смотрите.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38635679
Maxim BogukНариман Алимурадов,

Так не бывает.
Вы что то не так делаете или не там смотрите.

Сейчас проверил, если добавляю через gui pg_admin, то поля неуказанные в тригерной функции не переносятся даже если их значения изменялись, при вставке объекта из клиентского приложения, а оно у меня QGIS в синхронизируемую БД переносятся и те что неуказанны в теле функции.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38635723
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов,

log_min_duration_statement=0 в конфиг базы
и смотреть что за запросы и откуда приходят в базу...
и думать
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38641376
Здравствуйте друзья это снова я со своими нубскими вопросами(.

Создаю представление с множественным условием
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE VIEW rastitelnos_line_10000 AS 
 SELECT *
   FROM rastitelnos_line
  WHERE (rastitelnos_line.objectkey !~ 'L0071131000') OR (rastitelnos_line.objectkey !~ 'L0071131100') OR (rastitelnos_line.objectkey !~ 'L0071224000') OR (rastitelnos_line.objectkey IS NULL);

ALTER TABLE dorojnaya_set_10000
  OWNER TO alimuradov;
GRANT ALL ON TABLE dorojnaya_set_10000 TO alimuradov;


Если в исходную таблицу добавить запись со значением, указанным в фильтре
Код: sql
1.
WHERE (rastitelnos_line.objectkey !~ 'L0071131000') OR (rastitelnos_line.objectkey !~ 'L0071131100') OR (rastitelnos_line.objectkey !~ 'L0071224000') OR (rastitelnos_line.objectkey IS NULL);


то в представлении эта запись не отображается, если же в фильтре оставить только одно условие, например
Код: sql
1.
WHERE rastitelnos_line.objectkey !~ 'L0071224000' OR rastitelnos_line.objectkey IS NULL;


и внести запись со значением этого условия, то запись в представлении отображается. Полагаю ошибка в синтаксисе.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38641408
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(A!=B) OR (A!=C) - истина для любого значения A при разных B и C

вам наверное нужно (A!=B AND A!=C) OR (A IS NULL)

A NOT IN (B, C) OR A IS NULL
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38641786
LeXa NalBat,
Сделал так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE VIEW rastitelnos_line_10000 AS 
 SELECT *
   FROM rastitelnos_line
  WHERE ((rastitelnos_line.objectkey != 'L0071131000') AND (rastitelnos_line.objectkey !='L0071131100') AND (rastitelnos_line.objectkey != 'L0071224000')) OR (rastitelnos_line.objectkey IS NULL);

  ALTER TABLE rastitelnos_line_10000
  OWNER TO alimuradov;
GRANT ALL ON TABLE rastitelnos_line_10000 TO alimuradov;



Вьюшка получается пустой, записи не отображаются. Пробовал вариант с NOT IN результат такой же, пустое представление.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38641847
Нариман Алимурадов,

и вот так тоже, но толку нет.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
CREATE OR REPLACE VIEW rastitelnos_line_10000 AS 
 SELECT *
   FROM rastitelnos_line
  WHERE rastitelnos_line.objectkey NOT IN ('L0071131000','L0071131100','L0071224000') OR rastitelnos_line.objectkey IS NULL;

  ALTER TABLE rastitelnos_line_10000
  OWNER TO alimuradov;
GRANT ALL ON TABLE rastitelnos_line_10000 TO alimuradov;
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38642068
Если в условии оставить одно значение, то записи отображаются
Код: sql
1.
WHERE rastitelnos_line.objectkey NOT IN ('L0071131000','L0071131100','L0071224000') OR rastitelnos_line.objectkey IS NULL;
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38648425
Надо было сделать так.
Код: sql
1.
WHERE rastitelnos_line.objectkey::text <> 'L0071131000'::text AND rastitelnos_line.objectkey::text <> 'L0071131100'::text AND rastitelnos_line.objectkey::text <> 'L0071224000'::text;



А я почему то писал OR вместе AND
...
Рейтинг: 0 / 0
20 сообщений из 45, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение полей в таблице из другой БД.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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