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

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

Первая таблицы из DB_1 (откуда будет копироваться информация)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TABLE pokritiya
(
  id serial NOT NULL,
  the_geom geometry(MultiPolygon,900920),
  sem3 character varying(64),
  sem9 character varying(254),
  sem11 double precision,
  sem40 character varying(64),
  sem32768 character varying(254),
  sem32769 character varying(254),
  sem97 character varying(64),
  sem10 character varying(64),
  sem55 character varying(64),
  objectcode character varying(24),
  objectkey character varying(64),
  objectid character varying(24),
  objectname character varying(254),
  CONSTRAINT pokritiya_pkey PRIMARY KEY (id )
)




В DB_2 создам аналогичную таблицу но без некоторых полей.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE pokritiya
(
  id serial NOT NULL,
  the_geom geometry(MultiPolygon,900920),
  sem3 character varying(64),
  objectcode character varying(24),
  objectkey character varying(64),
  objectid character varying(24),
  objectname character varying(254),
  CONSTRAINT pokritiya_pkey PRIMARY KEY (id )
)




Мне нужно будет писать один тригер на обновление всех выбранных полей. Или для каждой колонки свой тригер??
Ну и собственно сам синтаксис, как указывать путь до таблицы из другой БД. Друзья буду благодарен любой помощи и наставлениям.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38628969
Так как у меня синхронизация будет одностороняя, то достаточно будет просто сделать тригеры на обновление. На представлениях тоже получилось но втаком случае, у меня нет возмможности давать отдльные права на колонки.

В общем буду рад помощи в написанием синтаксиса тригера.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION granitsy_update()
  RETURNS trigger AS
$BODY$
   BEGIN 
         id=(id из аналогичной  таблицы в  другой бд)
         the_geom = (the_geom из аналогичной  таблицы в  другой бд )
         NEW.created:=current_timestamp;
         NEW.created_by:=session_user; 
       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION granitsy_update()
  OWNER TO redaktor_granits;



Еще ребята, посоветуйте, как лучше сделать. Синхронизацию таблиц в другую БД. или же в той же БД но в другую схему.
Размер БД в данное время 250 Mb, максимальный размер который может достичь БД 2 - 3 Gb не больше.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629188
тело триггера
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
CREATE OR REPLACE FUNCTION dorojnaya_set_update()
  RETURNS trigger AS
$BODY$
   BEGIN 
         NEW.id=topo2000.public.dorojnaya_set.id;
         NEW.objectcode=topo2000.public.dorojnaya_set.objectcode;
         NEW.objectkey=topo2000.public.dorojnaya_set.objectkey;
         NEW.objectid=topo2000.public.dorojnaya_set.objectid;
         NEW.the_geom=topo2000.public.dorojnaya_set.the_geom; 
       RETURN NEW;
   END;
$BODY$



При записи объекта выдается ошибка.

Код: plaintext
1.
2.
3.
4.
5.
6.
Ошибки источника:
      Ошибка PostGIS при добавлении объектов: ОШИБКА:  ссылки между базами не реализованы: topo2000.public.dorojnaya_set.id
    СТРОКА 1: SELECT topo2000.public.dorojnaya_set.id
                     ^
    ЗАПРОС:  SELECT topo2000.public.dorojnaya_set.id
    КОНТЕКСТ:  функция PL/pgSQL dorojnaya_set_update(), строка 3, оператор присваивание
    

Кроме того, непонятно как будет происходить присваивание. В примере указанном мною по всей видимости новые значения будут зполняться из другой БД. В мне нужно чтоб новые значения наоборот туда ПИСАЛИСЬ. Я слаб в SQL, i need help(
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629204
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Нариман Алимурадов, в postgresql нет такого синтаксиса.
Если нужно подключиться к другой базе используйте dblink или FDW

Вот нафига в вашем случае другая база? Разберитесь вначале с правами ( GRANT / REVOKE / SECURITY DEFINER ...).
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629239
V&N Нариман Алимурадов, в postgresql нет такого синтаксиса.
Если нужно подключиться к другой базе используйте dblink или FDW

Вот нафига в вашем случае другая база? Разберитесь вначале с правами ( GRANT / REVOKE / SECURITY DEFINER ...).

Говоря про права Вы имеете ввиду, давать права на отдельные колонки???
В моем случае, речь идет о пространственных данных, и как бы правильнее будет иметь разделеннные БД.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629267
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Нариман Алимурадов... давать права на отдельные колонки???...
нет, права на таблицу.

Две таблички, одна - "общедоступная" с публичной информацией, вторая "с ограниченным доступом"- с дополнительной информацией. Связь - один к одному. типа:
Код: plsql
1.
2.
3.
4.
5.
create table t1 (id serial not null primary key);
create table t1_add (id int not null primary key,  constraint fk_t1_id foreign key (id) references t1 (id));
grant select, insert, update, delete on t1 to public;
revoke select, insert, update, delete on t1_add from public;
grant select, insert, update, delete on t1_add to security_user(role);
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629278
Но причем тут права, если я хочу уже из имеющейся исходной таблицы, сформировать вторую таблицу, без некоторых полей, и более того еще скрывать записи которые имеют определенные значения.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629293
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадо
Это не MS SQL
Вам же сказали dblink
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629295
ARTURVНариман Алимурадо
Это не MS SQL
Вам же сказали dblink

Даже в пределах одного сервера для заглядывания в другуб БД необходим dblink?
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629300
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
Но причем тут права... разграничение доступа будет на уровне приложения или субд?
...хочу уже из имеющейся исходной таблицы, сформировать вторую таблицу, без некоторых полей... зачем дублировать одни и те-же данные?
...сформировать вторую таблицу, без некоторых полей... у вас будет несколько приложений, которые работают с разными наборами полей или туча if login_name = ... query = "select ..."?
и более того еще скрывать записи которые имеют определенные значения.Скрывать можно через view или function, возвращающие набор.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629614
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовARTURVНариман Алимурадо
Это не MS SQL
Вам же сказали dblink

Даже в пределах одного сервера для заглядывания в другуб БД необходим dblink?

да... на уровне sql базы полностью изолированы...
нужен доступ совместный - используйте схемы для этой цели
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629654
ARTURV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовARTURVНариман Алимурадо
Это не MS SQL
Вам же сказали dblink

Даже в пределах одного сервера для заглядывания в другуб БД необходим dblink?
Да
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629739
V&NНо причем тут права... разграничение доступа будет на уровне приложения или субд?
...хочу уже из имеющейся исходной таблицы, сформировать вторую таблицу, без некоторых полей... зачем дублировать одни и те-же данные?
...сформировать вторую таблицу, без некоторых полей... у вас будет несколько приложений, которые работают с разными наборами полей или туча if login_name = ... query = "select ..."?
и более того еще скрывать записи которые имеют определенные значения.Скрывать можно через view или function, возвращающие набор.

1) Разграничение прав будет на уровне СУБД.
2) Того требуют ГОСТЫ и порядок работы
3) У меня будут множество клиентов, которым показ некоторых данных запрещен из за секретности
4) Этот вариант меня тоже заинтересовал

в частности создаю представление
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR REPLACE VIEW dorojnaya_set_10000 AS 
 SELECT dorojnaya_set.id,
    dorojnaya_set.the_geom,
    dorojnaya_set.sem9,
    dorojnaya_set.sem11,
    dorojnaya_set.objectcode,
    dorojnaya_set.objectkey,
    dorojnaya_set.objectid,
    dorojnaya_set.objectname
   FROM dorojnaya_set WHERE objectkey !~ 'P0062150000';

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




Где пытаюсь поставить условие WHERE objectkey !~ 'P0041185000 которое исключало бы, попадание объектов с определенной семантиков в представление. Однако в таком случае у меня в представлении не отображаются вновь создаваемые объекты. Если условие убрать то все нормально отображается, но меня так не устраивает, так как еще раз повторюсь есть записи которые необходимо скрывать
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629909
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман АлимурадовОднако в таком случае у меня в представлении не отображаются вновь создаваемые объекты.добавить OR objectkey IS NULL
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629925
LeXa NalBatНариман АлимурадовОднако в таком случае у меня в представлении не отображаются вновь создаваемые объекты.добавить OR objectkey IS NULL

Изменения теперь переносятся и в представление.
Но.. Если я создаю запись в которой objectkey='P0062150000' то она все равно отображается в представлении, что не есть хорошо((((
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629933
Упссс. простите ошибся с запросом. все норм, объекты которые исключены в условии не отображаются как и требовалось. спасибо большое.)) Буду экспериментировать и тестировать, если что отпишусь, всем спасибо огромное за помощь!)
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38629980
V&N
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
V&N
Гость
автор1) Разграничение прав будет на уровне СУБД. автор2) Того требуют ГОСТЫ и порядок работыкакая-то надуманная фигня, да еще и с геморроем на соответствие ключей и данныхавтор3) У меня будут множество клиентов, которым показ некоторых данных запрещен из за секретности секретность не противоречит наличию данных в одной базе, и не важно в одной или нескольких схемах, потому что см пункт 1.
упрощенный пример VIEWS:
Код: plsql
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.
create role role_public;
create role role_secure;

create user user1 login;
grant role_public to user1;
--grant role_secure to user1;
revoke role_secure from user1;

drop table if exists t1, t1_add cascade;
create table t1 (id serial not null primary key, decr varchar);
create table t1_add (id int not null primary key, s1 varchar, s2 varchar,  constraint fk_t1_id foreign key (id) references t1 (id));

insert into t1 (decr) values ('v1'), ('v2'), ('v3'), ('v4');
insert into t1_add (id, s1, s2) select id, 's'||id, 's0'||id from t1;

create view v_t1 as 
select * 
  from t1
 where pg_has_role('role_public', 'MEMBER');
grant select on v_t1 to public;

create view v_t1_add as 
select * 
  from t1_add
 where pg_has_role('role_secure', 'MEMBER');

create or replace view v_t1_t1_add as 
select t1.id, t1.decr, t1_add.s1, t1_add.s2
  from v_t1 as t1 left join v_t1_add as t1_add on t1.id = t1_add.id;
grant select on v_t1_t1_add to public;

--connect user1
select * from v_t1;
select * from v_t1_add;
select * from v_t1_t1_add;
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38630134
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадов1) Разграничение прав будет на уровне СУБД.
2) Того требуют ГОСТЫ и порядок работы
3) У меня будут множество клиентов, которым показ некоторых данных запрещен из за секретности
4) Этот вариант меня тоже заинтересовал


все ограничения которые можно сделать на уровне разных двух баз
прекрасно делаются и на уровне двух разных схем в пределах одной базы...
почитайте про права на схемы и таблицы перед тем как городить views
и тем более перед тем как городить dblink триггера
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38630137
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukНариман Алимурадов1) Разграничение прав будет на уровне СУБД.
2) Того требуют ГОСТЫ и порядок работы
3) У меня будут множество клиентов, которым показ некоторых данных запрещен из за секретности
4) Этот вариант меня тоже заинтересовал


все ограничения которые можно сделать на уровне разных двух баз
прекрасно делаются и на уровне двух разных схем в пределах одной базы...
почитайте про права на схемы и таблицы перед тем как городить views
и тем более перед тем как городить dblink триггера

хотя я посмотрел исходную задачу - тут скорее да лучше через views делать и правильнее...
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38630181
Maxim Boguk,

Дело в том что данные у меня геопространственные. Поднимается картографический сервис. Одновременно на карте могут находится с десяток таблиц, и при изменении масштаба например к БАЗЕ посылается куч запросов на перерисовку карты.

Карта исходная у меня в масштабе 1:2000, на основе ее я хочу сформировать карту масштаба 1:10 000, при этом соблюдая требования допустимой детализации карты для этого масштаба.

Вариант с представлением у меня получился (спасибо ребятам за помощь), теперь бы еще опробовать вариант с триггерами и dblink чтоб проверить в каком случае будет оптимальная производительность. А вот как прописать триггеры на перенес данных в другую таблицу мне пока не совсем ясно(.
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38630351
Ребята помогите пожалуйста переделать данный триггер с использованием dblink предполагается что имеются две таблицы pokritiya.
Одна в БД map2000 другая в БД topo2000 имеются описанные в первом посте. Обе БД располагаются на одном серваке.


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE OR REPLACE FUNCTION pokritiya_update()
  RETURNS trigger AS
$BODY$
   BEGIN 
         id=(id из аналогичной  таблицы в  другой бд)
         the_geom = (the_geom из аналогичной  таблицы в  другой бд )
         NEW.created:=current_timestamp;
         NEW.created_by:=session_user; 
       RETURN NEW;
   END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION pokritiya_update()
  OWNER TO redaktor_granits;
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38633433
ребят подскажите пожалуйста dblomk следует использовать впряо в теле триггерной функции?
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38633512
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нариман Алимурадовребят подскажите пожалуйста dblomk следует использовать впряо в теле триггерной функции?

RTFM блин доку вам тут никто не будет пересказывать
http://www.postgresql.org/docs/9.3/interactive/dblink.html
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38633568
Написал тригернуюю функцию
Код: 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=***.***.***.** port=5432 dbname=*** user=***** password=*****');
	 perform dblink_exec('insert into dorojnaya_set(id_0, the_geom, objectcode, objectkey, objectid ) values ('||NEW.id_0||','''||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;



Ну и собственно сам триггер
Код: sql
1.
2.
3.
4.
5.
CREATE TRIGGER dorojnaya_set1_update
  BEFORE INSERT OR UPDATE
  ON dorojnaya_set
  FOR EACH ROW
  EXECUTE PROCEDURE dorojnaya_set1_update();




При добавлении записей в исходную таблицу и попытке их сохранить выдается ошибка.

авторОшибки: ОШИБКА: не добавлен 1 объект.

Ошибки источника:
Ошибка PostGIS при добавлении объектов: ОШИБКА: в записи "new" нет поля "id_0"
КОНТЕКСТ: SQL-оператор: "SELECT dblink_exec('insert into dorojnaya_set(id_0, the_geom, objectcode, objectkey, objectid ) values ('||NEW.id_0||','''||NEW.the_geom||''','''||NEW.objectcode||''','''||NEW.objectkey||''','''||NEW.objectcid||''');')"
функция PL/pgSQL dorojnaya_set1_update(), строка 4, оператор PERFORM
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #38633588
изменил NEW.id_0 на NEW.id теперь появилась следующая ошибка
авторОшибки источника:
Ошибка PostGIS при добавлении объектов: ОШИБКА: оператор не уникален: text || geometry
СТРОКА 1: ...de, objectkey, objectid ) values ('||NEW.id||','''||NEW.the_...
^
ПОДСКАЗКА: Не удалось выбрать лучшую кандидатуру оператора. Возможно, вам следует добавить явные преобразования типов.
ЗАПРОС: SELECT dblink_exec('insert into dorojnaya_set(id_0, the_geom, objectcode, objectkey, objectid ) values ('||NEW.id||','''||NEW.the_geom||''','''||NEW.objectcode||''','''||NEW.objectkey||''','''||NEW.objectcid||''');')
КОНТЕКСТ: функция PL/pgSQL dorojnaya_set1_update(), строка 4, оператор PERFORM
...
Рейтинг: 0 / 0
Заполнение полей в таблице из другой БД.
    #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
45 сообщений из 45, показаны все 2 страниц
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение полей в таблице из другой БД.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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