powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / как в РВ ... trigger
10 сообщений из 10, страница 1 из 1
как в РВ ... trigger
    #32778398
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в РВ узнать сработал TRIGGER или нет, т.е. не сам триггер а его тело?

Пример:
Есть TV внем каталоги из БД
На удаление каталога удаление каталога
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
DELETE FROM sp_lg where id_lg=:st_id_lg.text;
if sqlca.sqlcode<> 0  then
	MessageBox('', '')
	return
	rollback;
else
	MessageBox('',String(sqlca.typeof( ) ))
	tv_sp_lg.deleteitem(li_tv_ind)
	commit;
end if
...

На данную таблицу (sp_lg) стоит триггер
Код: plaintext
1.
2.
3.
4.
5.
...
BEGIN
MESSAGE 'Нельзя удалить текущую запись: TRIGGER "TR_SP_LG_ads_no_delete"' type warning to client;
RAISERROR  20000  'Нельзя удалить текущую запись';
ROLLBACK TRIGGER;
END
(на данный триггер большого внимания обращать не надо)

если посмотреть на первый скрипт то получается что католог удаляется а с базы запись нет (с учетом триггера), как быть или как сделать правильно???
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778436
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, что если сработал RAISEERROR из тела триггера, то SQLDBCODE будет равно 20000.

Не могу не обратить ваше внимание на то, что управление транзакциями в серверном коде требует очень ясного понимания, для чего это делается и к каким последствиям может привести. Например, допускаю (очень давно не работал с ASA), что выполнение rollback приведет к тому, что клиент будет считать запрос успешно выполненным.

И еще...
автор
Код: plaintext
1.
2.
3.
4.
5.
if sqlca.sqlcode<> 0  then
	MessageBox('', '')
	return
	rollback;
else
...
клиентский rollback в вашем коде никогда не сработает, а вот ставить его после MessageBox - очень плохой стиль...
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778449
zuzu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
также очень плохой стиль удалять данные из БД,
лутше всего перенести записи в другую таблицу и чистить эту табулку по мере надобности или поменять статус записи,
так у вас никогда не пропадут данные которые были случайно удаленны юзером.
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778467
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zuzuтакже очень плохой стиль удалять данные из БД,
лутше всего перенести записи в другую таблицу и чистить эту табулку по мере надобности или поменять статус записи,
так у вас никогда не пропадут данные которые были случайно удаленны юзером.Юзера вообще лучше к БД на пушечный выстрел не подпускать :-)))
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778524
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPROКак в РВ узнать сработал TRIGGER или нет, т.е. не сам триггер а его тело?

Пример:
Есть TV внем каталоги из БД
На удаление каталога удаление каталога
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
...
DELETE FROM sp_lg where id_lg=:st_id_lg.text;
if sqlca.sqlcode<> 0  then
	MessageBox('', '')
	return
	rollback;
else
	MessageBox('',String(sqlca.typeof( ) ))
	tv_sp_lg.deleteitem(li_tv_ind)
	commit;
end if
...

На данную таблицу (sp_lg) стоит триггер
Код: plaintext
1.
2.
3.
4.
5.
...
BEGIN
MESSAGE 'Нельзя удалить текущую запись: TRIGGER "TR_SP_LG_ads_no_delete"' type warning to client;
RAISERROR  20000  'Нельзя удалить текущую запись';
ROLLBACK TRIGGER;
END
(на данный триггер большого внимания обращать не надо)

если посмотреть на первый скрипт то получается что католог удаляется а с базы запись нет (с учетом триггера), как быть или как сделать правильно???
В триггере MESSAGE можно смело убирать - PB его не увидит. Понять, что операция была прервана можно будет по ошибке с RAISERROR. Для PB тогда у SQLCA свойства будут установлены следующим образом:
Код: plaintext
1.
2.
SQLCode = - 1 
SQLDBCode = - 20000 
SQLErrorText = 'raise error выполнен: Нельзя удалить текущую запись'
Стоит обратить внимание, что оператор ROLLBACK TRIGGER в отличие от оператора ROLLBACK откатывает не всю транзакцию, а только удаление из текущей таблицы и все, что происходило в пределах триггера, так что использовать этот оператор надо четко себе представляя, почему именно не используется полный откат транзакции. Кстати если выставить опцию CONTINUE_AFTER_RAISERROR = 'OFF', то команда RAISERROR будет работать аналогично оператору SIGNAL, сразу прерывая выполнение триггера, перехватываясь в блоке EXCEPTION и не требуя наличия в триггере оператора ROLLBACK и RETURN после нее.

По поводу замечаний - естественно ROLLBACK никогда не сработает после того, как уже был осуществлен выход из процедуры по return. Плюс никогда нельзя использовать в пределах транзакции модальные окна и сообщения - это означает, что пока юзер не закроет такое окно, вся транзакция внутри БД будет висеть мертвым грузом, блокируя записи, а значит все остальные юзера так же будут сидеть и ждать нажатия кнопки OK :)
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778728
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо!
По поводу
Код: plaintext
1.
2.
3.
4.
if sqlca.sqlcode<> 0  then
	MessageBox('', '')
	return
	rollback;
else
Читал ведь, читал, и все равно сделал грубейшую ошибку.

Подозреваю что если сработал RAISEERROR из тела триггера то SQLDBCODE будет равно 20000.SQLCode = -1SQLDBCode = -20000SQLErrorText = 'raise error выполнен: Нельзя удалить текущую запись'


А на самом деле вышло следующие:
Код: plaintext
1.
2.
3.
sqldbcode: - 267 ; 
sqlcode: - 1 ; 
sqlerrtext: SQLSTATE =  37000 
[Sybase][ODBC Driver][Adaptive Server Anywhere]COMMIT/ROLLBACK not allowed within atomic operation

В триггере MESSAGE можно смело убирать - PB его не увидит.
Не удивляйтесь, но у меня видит, при чем только если поставить type warning

И последнее:
в триггере rollback тоже надо ставить перед riseerror ?
Код: plaintext
RAISERROR  20000  'Нельзя удалить текущую запись';
- как вывести в РВ это сообщение?
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32778932
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPROв триггере rollback тоже надо ставить перед riseerror ?
Код: plaintext
RAISERROR  20000  'Нельзя удалить текущую запись';
- как вывести в РВ это сообщение?Вы сами себе и ответили DIGITALPROА на самом деле вышло следующие:
Код: plaintext
1.
2.
3.
sqldbcode: - 267 ; 
sqlcode: - 1 ; 
sqlerrtext: SQLSTATE =  37000 
[Sybase][ODBC Driver][Adaptive Server Anywhere]COMMIT/ROLLBACK not allowed within atomic operation
надо исключить из кода триггера ROLLBACK. Именно на ошибки такого рода я и намекал, когда говорил, что авторуправление транзакциями в серверном коде требует очень ясного понимания, для чего это делается и к каким последствиям может привести.
Итак, по шагам:
1. Из тела триггера удаляете ROLLBACK
2. В событии dberror анализируете sqldbcode и sqlerrtext соответствующего объекта транзакций
3. Транзакциями управляете с клиента. Я бы для этой цели рекомендовал использовать событийную модель, аналогичную той, которая реализована в PFC.
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32779043
DIGITALPRO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to PL99
Спасибо, все получилось!

Но еще вопроик:
Я пока не пользуюсь (просто еще ненаучился) событием dberror, это плохо?

PFC не использую, пока бы просто с РВ более мение разобратся по нормальному, а потом можно и PFC начать изучать

P.S. и кто сказал что легко с Acces спрыгнуть на РВ, абсалютно другой подход.?!
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32779120
Фотография PL99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPROP.S. и кто сказал что легко с Acces спрыгнуть на РВ, абсалютно другой подход.?!Конечно нелегко, сам именно оттуда и спрыгивал не далее как 9 лет назад :-)
...
Рейтинг: 0 / 0
как в РВ ... trigger
    #32783258
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DIGITALPRO
В триггере MESSAGE можно смело убирать - PB его не увидит.

Не удивляйтесь, но у меня видит, при чем только если поставить type warning

Это не PB его видит. Это ODBC драйвер его видит.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / как в РВ ... trigger
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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