Гость
Форумы / [игнор отключен] [закрыт для гостей] / On-line изменение схемы таблицы 1С в SQL Server'е / 11 сообщений из 11, страница 1 из 1
14.01.2008, 04:45
    #35058748
Lobion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
Доброе всем времени суток!
У меня такой вопрос, хотя лучше сначала немного предыстории…
В конторе есть 1С + SQL Server.
Задача от руководства:
Обеспечить логирование всех изменений в базе, при чем, стандартным mlg-файлом не подходит (была ситуация, когда один шибко умный пассажир просто-напросто потер логи о своих дейвствиях).
Решение:
В 1С заводится справочник «Лог». При вводе нового элемента и редактирования анализируется 1cv7.dds для выяснения какие таблицы и поля использует тот или иной справочник. При записи напрямую в SQL выполняется запрос, который создает триггер у нужной таблицы и создает таблицы куда пишет триггер. Плюс у справчника исть булево значение «Вкл/Выкл» - для включения или выключения триггера. Система работает, но есть одно НО: если при добавлении / включении / выключении / удалении триггера у кого-то открыт справочник (для которого задается параметр триггера), то 1С ругается «Could not complete cursor operation because the table schema changed after the cursor», и вылетает. Но триггер изменяется успешно.
Вот эти скульные запрос:
ИмяТаблицы -> SC1809
ПоляТаблицы-> ID, Descr и т. д.
Для добавления таблицы под логи:
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT *
INTO [СокрЛП(ИмяТаблицы)_log] 
FROM [СокрЛП(ИмяТаблицы)] 
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD user_log [char]( 50 ) COLLATE Cyrillic_General_CI_AS NULL 
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD user_date [datetime] NULL
ALTER TABLE СокрЛП(ИмяТаблицы)_log ADD type_action [char]( 250 ) COLLATE Cyrillic_General_CI_AS NULL 
Для добавления триггеров:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE TRIGGER [tСокрЛП(ИмяТаблицы)] ON [dbo].[СокрЛП(ИмяТаблицы)]
FOR INSERT, UPDATE, DELETE AS 
IF @@ROWCOUNT >  0  
SET NOCOUNT ON 
--Выполняем запрос если в таблицу добавлена новая запись
 IF NOT EXISTS(SELECT * FROM deleted) 
INSERT СокрЛП(ИмяТаблицы)_log (ПоляТаблицы, user_log, user_date, type_action) 
SELECT  ПоляТаблицы, suser_sname(), getdate(), 'Введен новый' 
FROM inserted 
--Выполняем запрос если запись в таблице удалена
ELSE IF NOT EXISTS(SELECT * FROM inserted) 
INSERT  СокрЛП(ИмяТаблицы)_log ( ПоляТаблицы, user_log, user_date, type_action) 
SELECT ПоляТаблицы, suser_sname(), getdate(), 'Удален' 
FROM deleted 
--Выполняем запрос если запись в таблице изменена
ELSE 
INSERT СокрЛП(ИмяТаблицы)_log (ПоляТаблицы, user_log, user_date, type_action) 
SELECT ПоляТаблицы suser_sname(), getdate(), 'Изменен' 
FROM inserted

Для включения / выключения триггеров:
Код: plaintext
1.
2.
ALTER TABLE [СокрЛП(ИмяТаблицы)] ENABLE TRIGGER [tСокрЛП(ИмяТаблицы)]"
ALTER TABLE [СокрЛП(ИмяТаблицы)] DISABLE TRIGGER [tСокрЛП(ИмяТаблицы)]

Вопрос:
Можно ли с этим как-то бороться и как?
...
Рейтинг: 0 / 0
14.01.2008, 07:30
    #35058782
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
А зачем при каждом изменении анализировать dds?
Ведь он меняется только при изменении структуры метаданных в конфигураторе. Тогда (т.е. после конфигурирования, а не во время работы пользователей) и готовить все триггеры.
...
Рейтинг: 0 / 0
14.01.2008, 09:24
    #35058888
Lobion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
pailА зачем при каждом изменении анализировать dds?
Ведь он меняется только при изменении структуры метаданных в конфигураторе. Тогда (т.е. после конфигурирования, а не во время работы пользователей) и готовить все триггеры.
dds анализировать надо только когда создается новый элемент справочника "Лог", чтобы сопоставить название в метаданных и в таблицах скуля, т. е. чтобы понять, что, например, SC1809 - ни что иное, как Справочник.Кассы.
...
Рейтинг: 0 / 0
14.01.2008, 11:55
    #35059399
tvm
tvm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
Lobion
dds анализировать надо только когда создается новый элемент справочника "Лог", чтобы сопоставить название в метаданных и в таблицах скуля, т. е. чтобы понять, что, например, SC1809 - ни что иное, как Справочник.Кассы.
достаточно сделать сопоставление объектов и скульных таблиц только при запуске в режиме предприятия. закинуть все это в какую-нить таблицузначений например
...
Рейтинг: 0 / 0
14.01.2008, 12:16
    #35059475
Lobion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
tvm
достаточно сделать сопоставление объектов и скульных таблиц только при запуске в режиме предприятия. закинуть все это в какую-нить таблицузначений например
Как парсить ддс - НЕСУЩЕСТВЕННО!!! Важнее сам вопрос!
...
Рейтинг: 0 / 0
14.01.2008, 12:23
    #35059504
pail
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
Если вопрос в том, как отучить 1С ругаться на изменение схемы базы во время работы пользователей с данными - то следует рассмотреть возможность вообще отказаться от таких изменений, и провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). Или были заданы другие вопросы?
...
Рейтинг: 0 / 0
14.01.2008, 12:34
    #35059535
tvm
tvm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
pail...провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). ...
так вот и я почти про тоже. на одной из моих прошлых работ тоже делали логирование. так вот при входе первого пользователя сравнивался dds и таблицы базы. если было отличие то пересоздавались триггеры
...
Рейтинг: 0 / 0
14.01.2008, 12:37
    #35059549
Lobion
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
pailЕсли вопрос в том, как отучить 1С ругаться на изменение схемы базы во время работы пользователей с данными - то следует рассмотреть возможность вообще отказаться от таких изменений, и провести добавление всех необходимых полей и триггеров ДО того, как пустить в базу пользователей. Т.е. провести изменения схемы во время конфигурирования (сразу после закрытия конфигуратора). Или были заданы другие вопросы?
Да, вопрос именно в этом. Я совершенно ясно понимаю, что изменять онлайн схему таблицы нельзя... Все-равно, может потребоваться включать или исключать объект метеданных в/из списка логируемых. Вобщем-то и решение нашлось: использовать временную таблицу для переброски изменений в лог, потом очищать ее. А в таблице лога тогда можно будет включать или отключать триггер.

Тут еще один вопрос возник, с Вашего позволения озвучу. Вот такой запрос добавляет триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER [ttable_log] ON [dbo].[table_tmp]
|FOR INSERT, UPDATE, DELETE AS 
|IF @@ROWCOUNT >  0  
|SET NOCOUNT ON 
|Declare @Юзер String,
|INSERT "+СокрЛП(ИмяТаблицы)+"_log ("+ПоляТаблицы+"user_log, user_date, type_action) 
|SELECT "+ПоляТаблицы+"suser_sname(), getdate(), type_action 
|FROM inserted 
|DELETE FROM table_tmp

А как бы сделать так, чтобы вместо suser_sname(), было глПользователь, который вносит изменения в справочник?
...
Рейтинг: 0 / 0
14.01.2008, 19:14
    #35060943
VVVVVV
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
обрати внимание на статейку

Логирование средствами MS SQL
http://www.1csql.ru/materials/articles/develop.html~49e72144-3910-2323-ade1-bc42f7e4d100
...
Рейтинг: 0 / 0
21.01.2008, 15:23
    #35076263
Sure
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
Lobion[quot pail]
Тут еще один вопрос возник, с Вашего позволения озвучу. Вот такой запрос добавляет триггер:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TRIGGER [ttable_log] ON [dbo].[table_tmp]
|FOR INSERT, UPDATE, DELETE AS 
|IF @@ROWCOUNT >  0  
|SET NOCOUNT ON 
|Declare @Юзер String,
|INSERT "+СокрЛП(ИмяТаблицы)+"_log ("+ПоляТаблицы+"user_log, user_date, type_action) 
|SELECT "+ПоляТаблицы+"n.DESCR, getdate(), type_action 
|FROM inserted, "+ТаблицаИмен+" n WHERE n.ROW_ID=@@SPID
|DELETE FROM table_tmp

А как бы сделать так, чтобы вместо suser_sname(), было глПользователь, который вносит изменения в справочник?
Вот, например, в ПроКлубе есть мехнанизм, который связывает номера соединений с именами пользователей 1С:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=5&lid=3344

|SELECT "+ПоляТаблицы+"n.DESCR, getdate(), type_action
|FROM inserted, "+ТаблицаИмен+" n WHERE n.ROW_ID=@@SPID
...
Рейтинг: 0 / 0
21.01.2008, 15:29
    #35076283
Sure
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
On-line изменение схемы таблицы 1С в SQL Server'е
Извините, продолжаю:
в приведённых выше двух строчках показано, как из таблицы "ТаблицаИмен" взять имя пользователя в 1С (n.DESCR)

Кстати, проверяя подменённую процедуру при входе пользователя в 1С, можно увидеть, что изменилась конфигурация, что на SQL нужно по-новому расставлять триггеры...
...
Рейтинг: 0 / 0
Форумы / [игнор отключен] [закрыт для гостей] / On-line изменение схемы таблицы 1С в SQL Server'е / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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