powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение полей в таблице из другой БД.
25 сообщений из 45, страница 1 из 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
25 сообщений из 45, страница 1 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Заполнение полей в таблице из другой БД.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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