SELTA/cursorstriggers: различия между версиями

Материал из Etersoft wiki
Перейти к навигацииПерейти к поиску
 
(не показаны 2 промежуточные версии 2 участников)
Строка 1: Строка 1:
[[Category:SELTA]]
[[Category:PostupgradeWorkRequired]]
{{MovedFromWikiEterSoftRu|SELTA/cursorstriggers}}


== Принцип работы динамических курсоров SELTA. ==
== Принцип работы динамических курсоров SELTA. ==


<div style="display: inline; color: red;">ВНИМАНИЕ</div>: описывается принцип работы SELTA начиная с версии 1.0.6
<div style="display: inline; color: red;">ВНИМАНИЕ</div>: описывается принцип работы SELTA начиная с версии 1.0.6


Данный материал поможет Вам в тонкой настройки ваших БД, работающих через SELTA, тем самым улучшив скорость их работы.  
Данный материал поможет Вам в тонкой настройки ваших БД, работающих через SELTA, тем самым улучшив скорость их работы.  




=== Принцип работы ===
=== Принцип работы ===


В настоящий момент в связи с отсутствием динамических курсоров в [http://wiki.etersoft.ru/PostgreSQL PostgreSQL] в SELTA имитируется их работа в odbc драйвере.  
В настоящий момент в связи с отсутствием динамических курсоров в PostgreSQL в SELTA имитируется их работа в odbc драйвере.  
 
 
 
При каждом вызове метода SQLFetch для динамического курсора в ODBC драйвере проверяется наличие изменений в таблице(или нескольких) на основе которой был создан курсор. Обновления курсора происходит, только если в таблице произошли изменения.
 


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


За фиксирование изменений в таблицах, отвечает таблица pg_table_changes*, содержащая в себе имя таблиц и количество изменений.
За фиксирование изменений в таблицах, отвечает таблица pg_table_changes*, содержащая в себе имя таблиц и количество изменений.


Изменения в таблицу pg_table_changes добавляют триггеры, имеющиеся у таблиц, созданных SELTA.
Изменения в таблицу pg_table_changes добавляют триггеры, имеющиеся у таблиц, созданных SELTA.


Замечание:


 
изменения не всех таблиц фиксируются в pg_table_changes, соответственно, не у всех таблиц есть триггеры. Если обновляется динамический курсор, основанный на таблице, изменения в которой не фиксируются, курсор пересоздаётся.
замечание:
 
изменения не всех таблиц фиксируются в pg_table_changes, соответственно, не у всех таблиц есть триггеры. Если обновляется динамический курсор, основанный на таблице, изменения в которой не фиксируются, курсор пересоздается.
 
 


=== Почему надо настраивать ===
=== Почему надо настраивать ===


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


Создастся или не создастся триггер на таблицу и соответствующая запись в pg_table_changes, зависит от того, соответствует ли имя таблицы маскам, хранящимся в таблице pg_trigger_table_mask**.
Создастся или не создастся триггер на таблицу и соответствующая запись в pg_table_changes, зависит от того, соответствует ли имя таблицы маскам, хранящимся в таблице pg_trigger_table_mask**.




 
=== Настройка ===
=== Настройка##LINKTOFTN ftnd1## ===


1. Сделайте список таблиц, для которых нужно делать триггеры. Нужно делать триггеры для таблиц, для которых часто создаются и обновляются динамические  курсоры, и редко меняется информация ( например справочники). И не нужно делать триггеры, если динамические курсоры не создаются и не обновляются(или это происходит редко).
1. Сделайте список таблиц, для которых нужно делать триггеры. Нужно делать триггеры для таблиц, для которых часто создаются и обновляются динамические  курсоры, и редко меняется информация ( например справочники). И не нужно делать триггеры, если динамические курсоры не создаются и не обновляются(или это происходит редко).
Строка 55: Строка 35:


3. Запустите функцию pg_create_delete_trigger_from_mask() ("SELECT pg_create_delete_trigger_from_mask()"), будут созданы нужные триггеры на таблицы, ненужные удалены, записи в таблице pg_table_changes обновятся, в соответствии с таблицей pg_trigger_table_mask,  
3. Запустите функцию pg_create_delete_trigger_from_mask() ("SELECT pg_create_delete_trigger_from_mask()"), будут созданы нужные триггеры на таблицы, ненужные удалены, записи в таблице pg_table_changes обновятся, в соответствии с таблицей pg_trigger_table_mask,  


Эти действия можно проделывать неограниченное число раз.
Эти действия можно проделывать неограниченное число раз.


=== 1с ===
=== 1с ===
Строка 210: Строка 186:
|}
|}


Для довабления в руную, вы можете выполнить следующие запросы  
Для добавления вручную вы можете выполнить следующие запросы:


INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('sc%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('sc%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('cj%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('cj%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sjourn', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sjourn', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('1stoper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('1stoper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1soper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1soper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1scorent', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1scorent', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sentry', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sentry', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1saccs', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1saccs', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sconst', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sconst', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('pg_%', false, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('pg_%', false, false);


=== Приложение: ===
=== Приложение ===


* ''Таблица pg_table_changes''
* ''Таблица pg_table_changes''
Строка 289: Строка 265:




Для НЕ создания триггера для таблицы с именем table2, требуется написать имя таблицы в поле mask, указать, что ее НЕ следут включать в выборку -- в поле include = false, и точное соответствие equal = true
Для НЕ создания триггера для таблицы с именем table2, требуется написать имя таблицы в поле mask, указать, что её НЕ следует включать в выборку -- в поле include = false, и точное соответствие equal = true


{| border="1"
{| border="1"
Строка 327: Строка 303:




Для создания триггера для всех таблиц с именами начинающимеся с tb, дожны написать имя маску в поле mask ('tb%'), указать, что ее следут включать в выборку -- в поле include = true, и неточное соответствие equal = false
Для создания триггера для всех таблиц с именами начинающимеся с tb, дожны написать имя маску в поле mask ('tb%'), указать, что её следует включать в выборку -- в поле include = true, и неточное соответствие equal = false


{| border="1"
{| border="1"
Строка 360: Строка 336:


|}
|}




Строка 368: Строка 342:




=== Ссылки на сторонние дополнения===


Ссылки на сторонние дополнения:
* [http://infostart.ru/projects/3801/ Настройка курсоров на триггерах для 1C 7.7+Selta+Postgresql] — Дополнение для удобной настройки триггеров от Djelf.


##FTN ftnd1##[http://infostart.ru/projects/3801/ http://infostart.ru/projects/3801/] Дополнение для удобной настройки триггеров от Djelf.
[[Category:SELTA]]
[[Category:PostupgradeWorkRequired]]

Текущая версия на 17:01, 1 февраля 2018

Принцип работы динамических курсоров SELTA.

ВНИМАНИЕ

: описывается принцип работы SELTA начиная с версии 1.0.6

Данный материал поможет Вам в тонкой настройки ваших БД, работающих через SELTA, тем самым улучшив скорость их работы.


Принцип работы

В настоящий момент в связи с отсутствием динамических курсоров в PostgreSQL в SELTA имитируется их работа в odbc драйвере.

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

За фиксирование изменений в таблицах, отвечает таблица pg_table_changes*, содержащая в себе имя таблиц и количество изменений.

Изменения в таблицу pg_table_changes добавляют триггеры, имеющиеся у таблиц, созданных SELTA.

Замечание:

изменения не всех таблиц фиксируются в pg_table_changes, соответственно, не у всех таблиц есть триггеры. Если обновляется динамический курсор, основанный на таблице, изменения в которой не фиксируются, курсор пересоздаётся.

Почему надо настраивать

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

Создастся или не создастся триггер на таблицу и соответствующая запись в pg_table_changes, зависит от того, соответствует ли имя таблицы маскам, хранящимся в таблице pg_trigger_table_mask**.


Настройка

1. Сделайте список таблиц, для которых нужно делать триггеры. Нужно делать триггеры для таблиц, для которых часто создаются и обновляются динамические курсоры, и редко меняется информация ( например справочники). И не нужно делать триггеры, если динамические курсоры не создаются и не обновляются(или это происходит редко).

2. Заполните на основе этого списка таблицу pg_trigger_table_mask.

3. Запустите функцию pg_create_delete_trigger_from_mask() ("SELECT pg_create_delete_trigger_from_mask()"), будут созданы нужные триггеры на таблицы, ненужные удалены, записи в таблице pg_table_changes обновятся, в соответствии с таблицей pg_trigger_table_mask,

Эти действия можно проделывать неограниченное число раз.

Для таблиц 1с имеются стандартные маски они создадутся при создании, инициализации, или обновлении бд.

mask

include

equal

sc%

t

f

cj%

t

f

_1sjourn

t

t

1stoper

t

t

_1soper

t

t

_1scorent

t

t

_1sentry

t

t

_1saccs

t

t

pg_%

f

f

Для добавления вручную вы можете выполнить следующие запросы:

INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('sc%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('cj%', true, false);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sjourn', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('1stoper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1soper', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1scorent', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sentry', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1saccs', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('_1sconst', true, true);
INSERT INTO pg_trigger_table_mask (mask, include, equal) VALUES ('pg_%', false, false);

Приложение

  • Таблица pg_table_changes
tabname Имя таблицы
numberchanges Количество изменений

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



    • Таблица pg_trigger_table_mask
mask маска
include Входит в выборку (true делать для таблицы с такой маской триггер и запись в pg_table_changes, false -- не деклать)
equal Соответствие (true - точное('='), false не точное ('LIKE'))


Заполните поле mask, include, equal в соответствии с тем, какие триггеры нужны для БД, а какие нет.

Для создания триггера для таблицы с именем table1, требуется написать имя таблицы в поле mask, указать, что ее следует включать в выборку -- в поле include = true, и точное соответствие equal = true

mask

include

equal

table1

true

true




Для НЕ создания триггера для таблицы с именем table2, требуется написать имя таблицы в поле mask, указать, что её НЕ следует включать в выборку -- в поле include = false, и точное соответствие equal = true

mask

include

equal

table2

false

true



Для создания триггера для всех таблиц с именами начинающимеся с tb, дожны написать имя маску в поле mask ('tb%'), указать, что её следует включать в выборку -- в поле include = true, и неточное соответствие equal = false

mask

include

equal

tb%

true

false


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


Ссылки на сторонние дополнения