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

Откуда:
Сообщений: 13
есть for update триггер который при совпадении паспортов выдаёт ошибку, что паспорт не изменили. Нужно чтобы он просто выводил эту описанную ошибку, а то у меня даже не заходит в триггер

drop trigger PassengerUpdate
go

create trigger PassengerUpdate
on Passengers
for update
as
declare @Passport int
select @Passport = i.Passport from inserted i;
begin
	if @Passport =  @Passport 
	begin
		print 'При смене фамилии не был изменён номер паспорта'
		rollback tran
	end
end
go

select * from Passengers

update Passengers
set Passport = 2222
where Full_Name = 'Петров Пётр Петрович'


К сообщению приложен файл. Размер - 26Kb
9 дек 19, 16:50    [22035988]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1226
wearedogs,

declare @Passport int

select @Passport = i.Passport from inserted i;


это ж НАБОр данных (Set) а не 1 запись - все вставленные записи

SELECT * FROM  inserted

напиши в 1 строке тригера для отладки
а также select @Passport
чтоб увидеть что у тебя там


зы насчет rollbaсk tran В теле триггреа я НЕ уверен - но народ лучше скажет можно ли
9 дек 19, 16:56    [22036004]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
wearedogs
Member

Откуда:
Сообщений: 13
Гулин Федор, не пашет
9 дек 19, 17:02    [22036017]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
wearedogs
Member

Откуда:
Сообщений: 13
Гулин Федор, как можно изменить чтобы этот триггер и имел вывод при ошибке и он работал? Не подскажите?
9 дек 19, 17:03    [22036020]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
wearedogs
меня даже не заходит в триггер
Странности не видите в строке:
if @Passport =  @Passport 

wearedogs
Гулин Федор, не пашет
"Не пашет" должно выглядеть как сообщение об ошибке, ну или какое то внятное описание.
9 дек 19, 17:12    [22036034]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
wearedogs
Member

Откуда:
Сообщений: 13
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
drop trigger PassengerUpdate
go

create trigger PassengerUpdate
on Passengers
for update
as
declare @Passport int
select @Passport = i.Passport from inserted i;
begin
	if @Passport <0 or  @Passport >9999
	begin
		print 'Недопустимый номер пасспорта'
		rollback tran
	end
end
go

select * from Passengers

update Passengers
set Passport = 3333
where Full_Name = 'Петров Пётр Петрович'
9 дек 19, 17:12    [22036035]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31328
wearedogs
есть for update триггер который при совпадении паспортов выдаёт ошибку, что паспорт не изменили

wearedogs
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
drop trigger PassengerUpdate
go

create trigger PassengerUpdate
on Passengers
for update
as
declare @Passport int
select @Passport = i.Passport from inserted i;
begin
	if @Passport <0 or  @Passport >9999
	begin
		print 'Недопустимый номер пасспорта'
		rollback tran
	end
end
go

select * from Passengers

update Passengers
set Passport = 3333
where Full_Name = 'Петров Пётр Петрович'
Нужно то что?
Это триггер проверяет номер паспорта на диапазон, хоть и неправильно.
9 дек 19, 17:20    [22036045]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Гулин Федор
Member

Откуда: МИНСК
Сообщений: 1226
я вот думаю что будет в
select @Passport = i.Passport from inserted i;

если вставиться несколько строк СРАЗУ
подозреваю что вылезет ошибка
по идее если будет по 1 строке - то тригер отрабоать должен

update Passengers
set Passport = 3333
where Full_Name = 'Петров Пётр Петрович'
все будет ок
а если

set Passport = 333333333 то выйдет на rollback
и вот тут я НЕ уверен - проще проверить

но интересней что произойдет когда
where Full_Name in ( 'Петров Пётр Петрович' , 'Иванов .. ' , ...) -- несколькоз записей

Сообщение было отредактировано: 9 дек 19, 17:30
9 дек 19, 17:29    [22036066]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
Гулин Федор
я вот думаю что будет в
select @Passport = i.Passport from inserted i;

если вставиться несколько строк СРАЗУ
подозреваю что вылезет ошибка

почему?
в переменную можно любое число строк слить.
останется в ней последнее туда попавшее
9 дек 19, 17:36    [22036083]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
AndrF
Member

Откуда:
Сообщений: 2194
Как-то так:

ALTER TRIGGER PassengerUpdate
   ON  Passengers
   FOR UPDATE
AS 
BEGIN
	SET NOCOUNT ON
	IF UPDATE(Full_Name) AND EXISTS(SELECT * FROM Deleted d INNER JOIN Inserted i ON d.id = i.id AND d.Passport = i.Passport AND NOT d.Full_Name = i.Full_Name)AND NOT d.Full_Name = p.Full_Name)
		BEGIN
			RAISERROR ('При смене фамилии не был изменён номер паспорта', 16, 1);  
			ROLLBACK TRANSACTION
		END

END
GO
	
SELECT * FROM Passengers

UPDATE Passengers
		SET Full_Name =CONVERT(varchar,GETDATE(),113)
			,Passport= 23
	WHERE id=1

SELECT * FROM Passengers


Сообщение было отредактировано: 9 дек 19, 17:49
9 дек 19, 17:40    [22036090]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
wearedogs
Member

Откуда:
Сообщений: 13
AndrF, спасибо!
9 дек 19, 17:42    [22036097]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
AndrF
Member

Откуда:
Сообщений: 2194
Строку с IF можно заменить на:

	IF UPDATE(Full_Name) AND EXISTS(SELECT * FROM Deleted d INNER JOIN Inserted i ON d.id = i.id AND d.Passport = i.Passport AND NOT d.Full_Name = i.Full_Name)
9 дек 19, 17:47    [22036109]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
wearedogs
AndrF, спасибо!

а ничего, что "рабочий" вариант проверял номер паспосрта на вхождение в диапазон,
а этот проверяет, изменили ли номер?
wearedogs
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
drop trigger PassengerUpdate
go

create trigger PassengerUpdate
on Passengers
for update
as
declare @Passport int
select @Passport = i.Passport from inserted i;
begin
	if @Passport <0 or  @Passport >9999
	begin
		print 'Недопустимый номер пасспорта'
		rollback tran
	end
end
go

select * from Passengers

update Passengers
set Passport = 3333
where Full_Name = 'Петров Пётр Петрович'
9 дек 19, 17:48    [22036112]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
AndrF
Member

Откуда:
Сообщений: 2194
Yasha123
wearedogs
AndrF, спасибо!

а ничего, что "рабочий" вариант проверял номер паспосрта на вхождение в диапазон,
а этот проверяет, изменили ли номер?


Я дал ответ лишь на 1-вый вопрос темы, вообще-то...
9 дек 19, 17:50    [22036117]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
так он написал, что у него бардак,
и это не есть актуальный триггер.

...просто он потом удивляется, что у него "в триггер не заходит".
ну если делать одни изменения, а ждать реакцию на совсем другие,
то да, покажется, что и "не заходит"
9 дек 19, 17:53    [22036121]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
AndrF
Member

Откуда:
Сообщений: 2194
Yasha123
...просто он потом удивляется, что у него "в триггер не заходит".
ну если делать одни изменения, а ждать реакцию на совсем другие,
то да, покажется, что и "не заходит"


Вот я и показал как сделать чтобы заходило. И, кстати, лучше обходиться без переменной @Passport - она совершенно не нужна.
9 дек 19, 17:57    [22036125]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
AndrF
Строку с IF можно заменить на:

	IF UPDATE(Full_Name) AND EXISTS(SELECT * FROM Deleted d INNER JOIN Inserted i ON d.id = i.id AND d.Passport = i.Passport AND NOT d.Full_Name = i.Full_Name)
Что делает IF UPDATE(Full_Name) по-вашему? Зачем это здесь?
9 дек 19, 17:58    [22036127]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
AndrF
Member

Откуда:
Сообщений: 2194
Yasha123

почему?
в переменную можно любое число строк слить.
останется в ней последнее туда попавшее


Потому что только последнюю вы и проверите!
9 дек 19, 17:59    [22036128]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
AndrF

Вот я и показал как сделать чтобы заходило.

смешно.
при любом апдэйте в триггер на апдэйт "зайдет".
9 дек 19, 17:59    [22036130]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в триггере  [new]
Yasha123
Member

Откуда:
Сообщений: 1833
AndrF
Yasha123

почему?
в переменную можно любое число строк слить.
останется в ней последнее туда попавшее


Потому что только последнюю вы и проверите!

мой ответ не вам, А Федору.
он считает, что будет ошибка при складывании тучи строк в переменную.
вы тоже так считаете и не согласны с тем,
что сложить в переменную можно сколько угодно строк?
про то "что будет проверено", в моем ответе ни слова нет
9 дек 19, 18:02    [22036134]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить