powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Срабатывание триггеров в VFP
9 сообщений из 9, страница 1 из 1
Срабатывание триггеров в VFP
    #32112088
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Пытаюсь обновить одну базу VFP (.DBC) из другой. Поскольку пр-ние FoxPro знаю плохо, стал делать как привычнее - Delphi/ADO. И все бы ничего - но к некоторым таблицам привязаны триггеры, которые срабатывают при изменении записи. И вылетают ошибки типа "Trigger failed", "Row cannot be located for updating.." и пр. К тектам триггеров, как я понимаю, доступа нет - т.к. есть только база .DBC, есть .app
Возникает вопрос - можно ли их как-то отключить? Если нет, то что делать?
Ситуация странная - из самой бух.пр-мы изменить какой-нить налог - пжлста. А когда делаю это же программно, update-ом - получаю ошибку о "Trigger failed"
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112199
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> К тектам триггеров, как я понимаю, доступа нет - т.к. есть только база .DBC

Именно там и находится код триггеров. Правда исходный текст можно оттуда изъять, тогда нужен рефокс.

> Возникает вопрос - можно ли их как-то отключить?

DELETE TRIGGER ON TableName FOR DELETE | INSERT | UPDATE

> Если нет, то что делать?

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
You can modify triggers through the Table Designer or through the language.

To modify a trigger 

In the Table tab of the Table Designer, enter the new trigger expression in the Insert trigger, Update trigger, or Delete trigger box. 
-or- 

Issue the SET SAFETY OFF command, and then use the CREATE TRIGGER command. 
When you modify a trigger by first issuing the SET SAFETY OFF command and then re-creating the trigger, the old trigger expression is automatically deleted and replaced by the re-created trigger expression.


> вылетают ошибки типа "Trigger failed"

Понятное дело, там небось ссылки на закрытые таблицы и несуществующие переменные.
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112217
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Delete trigger, как я понимаю вообще удаляет триггер, т.е. дропает его.
Мне же нужно временно отключить его на время моего обновления. Этого, как я понял, нельзя.
Modify сделать, не имея текста триггера, тоже невозможно - если только заменить его на новый.
Удалить - и восстановить потом - я также не смогу, не имея исходного текста, так?
А из .DBC его выдернуть напрямую (а потом вставить обратно) нельзя никак?
.. ссылки на закрытые таблицы и несуществующие переменные
А табл. и переменные эти в тексте самой пр-мы, так?
Тогда получается что извне изменить таблицу просто невозможно, даже если обновл. данные корректны?
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112232
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подожди..
Код: plaintext
1.
2.
OPEN DATABASE xxx.dbc
USE xxx
MODIFY STRUCTURE

вкладка Table, там есть информация о триггерах?

Возможно там вызвается какая-либо функция, которая зашита в app.

Или

Код: plaintext
1.
2.
3.
4.
CLOSE ALL
USE xxx.dbc
LOCATE FOR objecttype='Table' AND objectname='xxx'
MODIFY MEMO property

Ты можешь сохранить содержимое (COPY MEMO to xxx.txt), удалить триггер, выполнить свои действия, а затем восстановить мемо из файла (APPEND MEMO property FROM xxx.txt OVERWRITE as 0).
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112253
aag
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там есть название триггерах, констрайнтах и пр.
2-ой вариант - с копированием в мемо - попробую обдумать, только в property не просто текст, там все в куче; довольно рискованно так отключать - сбойнет, а триггер уже не восстановишь. В общем куда ни кинь...
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112290
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Там есть название триггерах, констрайнтах и пр.

Там должно быть выражение, возвращающее .t. для соотв. операции. Возможно, это имя функции (или хр. процедуры), о чем я уже говорил.

> 2-ой вариант - с копированием в мемо - попробую обдумать, только в property не просто текст, там все в куче; довольно рискованно так отключать - сбойнет, а триггер уже не восстановишь. В общем куда ни кинь...

Правильно, не только текст. А кто сказал что мемо это только текст? Расширение txt я от недалекой фантазии в примере привел.
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112353
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для просмотра/редактирования текстов хранимых процедур и триггеров можно воспользоваться командой MODIFY PROCEDURE

Код: plaintext
1.
OPEN DATABASE xxx.dbc
MODI PROC

По названиям можно догадаться к какой таблице и на какое действие триггер.
Ну и, как рекомендовал NNN,не удаляя кода возвратить .T., где нужно.

Чего то типа
ALTER TABLE ... DISABLE TRIGGER...
как в TSQL нет
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112471
vklepko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Небольшое дополнение
Если пользоваться MODIFY PROCEDURE, то там в тексте должна быть одна важная строка
Код: plaintext
**__RI_FOOTER!@ Do NOT REMOVE or MODIFY this line!!!! @!__RI_FOOTER**

Код выше этой строки сгенерирован RI Builder-ом и может быть с помощью того же RI Builder-а перегенерирован.
Код ниже - написан разработчиком, не виден для RI Builder-а и не изменяется при регенерации. При одинаковых именах триггеров в верхней и нижней части, написанный разработчиком код оверрайдит сгенерированный.
...
Рейтинг: 0 / 0
Срабатывание триггеров в VFP
    #32112479
Фотография NNN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не факт, что триггер использует хр. процедуру.
еще один способо добраться до текста триггера:

Код: plaintext
1.
2.
OPEN DATABASE xxx.dbc
DISPLAY DATABASE TO FILE xxx.txt noconsole
MODIFY FILE xxx.txt


В файле дожно быть что-то вроде:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Database Name:          XXX
Database Path:          c:\...\xxx.dbc
Database Version:        10 

Database   StoredProceduresDependencies
...
Table      xxx
           *Path            xxx.dbf
           *UpdateTrigger   IIF(MESSAGEBOX( "xxx" , 36 )= 6 ,.T.,.F.)
           Field      id
           Field      fio
           Field      postind
           Field      address
...


Смотри, что у тебя стоит после *UpdateTrigger .
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Срабатывание триггеров в VFP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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