Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Триггер на проверку  [new]
voxpert
Member

Откуда:
Сообщений: 22
есть таблица выдача
и при записи должна происходить проверка, т.е дата возврата не может быть раньше даты выдачи
пытался
CREATE TRIGGER mytr1 
ON Выдача
FOR INSERT, UPDATE
AS
 
DECLARE @date1 TINYINT, @date2 TINYINT
 
SELECT @date1= DatePart (DAY, Дата_Выдачи)
@date2= DatePart (DAY, Дата_Возврата)
 
 
IF @date1> @date2
BEGIN
 
ROLLBACK TRAN
RAISERROR('ОШИБКА', 16, 10 )
END
11 дек 16, 20:55    [19990630]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Использование таблиц inserted и deleted
11 дек 16, 21:00    [19990657]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
iljy
Member

Откуда:
Сообщений: 8711
voxpert,

а нафига тут вообще триггер? более чем достаточно ограничения CHECK.
11 дек 16, 21:11    [19990704]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
voxpert
Member

Откуда:
Сообщений: 22
iljy,

по заданию :(
11 дек 16, 21:15    [19990717]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
voxpert,

а ROLLBACK зачем, боитесь, что не откатит при ошибке?
12 дек 16, 10:27    [19991863]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
voxpert
Member

Откуда:
Сообщений: 22
Владислав Колосов,

да,на всякий случай
12 дек 16, 13:16    [19992990]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
voxpert
да,на всякий случай
trancount
12 дек 16, 13:32    [19993084]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
Владислав Колосов

а ROLLBACK зачем, боитесь, что не откатит при ошибке?


А разве должна откатить откатит при severity = 16 ? :)

use tempdb 
go 

create table dbo.test (f1 varchar(30))
go
create trigger dbo.TI_test on dbo.test
after insert
as
begin 
	BEGIN tran 
		RAISERROR('ОШИБКА', 16, 10 )
	commit tran  

end 
go 

begin tran 
	insert into dbo.test select 'Record in table test'
commit tran 

select * from test 

go

drop table dbo.test
12 дек 16, 15:23    [19993892]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
PaulWist,

в этом коде архитектурная ошибка - нет обработчика ошибки в вызывающем коде. Вот так должно выглядеть:
use tempdb 
go 

create table dbo.test (f1 varchar(30))
go
create trigger dbo.TI_test on dbo.test
after insert
as
begin 
	BEGIN tran 
		RAISERROR('ОШИБКА', 16, 10 )
	commit tran  

end 
go 

BEGIN try
begin tran 
	insert into dbo.test select 'Record in table test'
commit tran 
END TRY
BEGIN CATCH
	ROLLBACK
	;THROW
END CATCH

select * from test 

go

drop table dbo.test
12 дек 16, 16:34    [19994327]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
Владислав Колосов
в этом коде архитектурная ошибка - нет обработчика ошибки в вызывающем коде. Вот так должно выглядеть:


Влад, так я не понял, зачем тогда была эта фраза:

Владислав Колосов

а ROLLBACK зачем, боитесь, что не откатит при ошибке?


а сам ROLLBACK используешь - почему?, ... всё таки боишся что не откатит по ошибке? :)
12 дек 16, 16:42    [19994365]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Владислав Колосов
в этом коде архитектурная ошибка - нет обработчика ошибки в вызывающем коде
Архитектурная ошибка - рассчитывать на наличие обработки исключений в вызывающем коде.
12 дек 16, 16:59    [19994478]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
PaulWist,

разве rollback у меня в триггере? BEGIN TRAN должен сопровождаться COMMIT при успехе и ROLLBACK при ошибке.
12 дек 16, 17:23    [19994561]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
invm
Владислав Колосов
в этом коде архитектурная ошибка - нет обработчика ошибки в вызывающем коде
Архитектурная ошибка - рассчитывать на наличие обработки исключений в вызывающем коде.

Обработчик ошибки ОБЯЗАН присутствовать в здоровом коде. Если не уверены, что код написан с учетом обработки - пишите свой обработчик.
Триггер сообщает о наличии/отсутствии ошибки при проверке. На этом его задачи заканчиваются. Всё остальное - только если невозможно иначе реализовать.
Что-либо распихивать по таблицам в триггере - это плохие практики, выполнять откат в триггере - плохие практики, писать код без обработки ошибок - плохие практики. Использовать однобуквенные алиасы - плохие практики. И тому подобное.
12 дек 16, 17:30    [19994591]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Владислав Колосов
Что-либо распихивать по таблицам в триггере - это плохие практики, выполнять откат в триггере - плохие практики, писать код без обработки ошибок - плохие практики. Использовать однобуквенные алиасы - плохие практики. И тому подобное.
Это всего лишь ваше частное мнение, не более того.
Из всего перечисленного могу согласится только с последними двумя пунктами.

ЗЫ: Писать триггер в рассчете на то, что вызывающий код будет оформлен определенным образом - не менее плохая практика.
12 дек 16, 17:41    [19994639]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
invm,

готов согласиться, но в, э-э, корпоративной разработке присутствуют всегда определенные правила, которые как раз и стандартизируют код. Т.е. программист пишет код в полной уверенности в том, что коллега так же соблюдает эти правила. Код рецензируют, что гарантирует соблюдение.

Понятно, что если разработчика пригласили на разовые работы на коленке что-то подправить, то он не может знать правила. Или же код написан полностью "на коленке" без соблюдения вообще чего-бы то ни было. В этом случае допустимо предположить, что последствия будут развиваться по наихудшему сценарию - т.е. нет ни обработчиков, ни внешних ключей, ни ограничений, даты и числа хранятся в символьных полях varchar(max) и тому подобное, транзакции отсутствуют или организованы непонятно как и код вообще ничего не гарантирует. Вот тогда бы я допустил этот ROLLBACK в триггере :)

Но это не значит, что это best practices, с учетом угроз MS отключить возможность использования этой команды в триггере.
12 дек 16, 17:50    [19994693]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
PaulWist
Member

Откуда:
Сообщений: 2231
Владислав Колосов
PaulWist,

разве rollback у меня в триггере? BEGIN TRAN должен сопровождаться COMMIT при успехе и ROLLBACK при ошибке.


Ну те ты признаешь, что Raiserror(.., 16, 10) не откатит по ошибке - ОК.
12 дек 16, 17:56    [19994718]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
PaulWist,

в таком виде не откатит :)
12 дек 16, 18:04    [19994734]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Владислав Колосов
с учетом угроз MS отключить возможность использования этой команды в триггере.

а ссылку на вот это вот дадите?
12 дек 16, 18:24    [19994797]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
daw,

убрали уже из справки? У меня нет от SQL2016.
12 дек 16, 18:25    [19994803]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
Владислав Колосов
daw,

убрали уже из справки? У меня нет от SQL2016.

устроит ссылка и на более старую справку. если на то пошло, то даже скриншот.
12 дек 16, 18:28    [19994815]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
Владислав Колосов
в, э-э, корпоративной разработке присутствуют всегда определенные правила, которые как раз и стандартизируют код. Т.е. программист пишет код в полной уверенности в том, что коллега так же соблюдает эти правила. Код рецензируют, что гарантирует соблюдение.
Код должен быть надежен вне зависимости от принятых правил и соглашений. Тем более, что сегодня эти правила одни, а завтра они изменились.
Владислав Колосов
с учетом угроз MS отключить возможность использования этой команды в триггере
Было анонсировано отключение возврата набора из триггера. Запрета rollback не помню. Пруф есть?
12 дек 16, 18:44    [19994875]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
invm
Запрета rollback не помню.
Запрета не было, но варнинг появляется.
12 дек 16, 19:29    [19995008]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
iap
Запрета не было, но варнинг появляется.
Э-э... И варнинга не помню.
12 дек 16, 20:08    [19995123]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
invm
iap
Запрета не было, но варнинг появляется.
Э-э... И варнинга не помню.
Что-то типа "выполнение прервано внутри триггера".
Не дословно, но близко
12 дек 16, 20:35    [19995185]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на проверку  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
iap
Что-то типа "выполнение прервано внутри триггера".
Это ошибка 3609 "The transaction ended in the trigger. The batch has been aborted."
12 дек 16, 20:40    [19995197]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить