Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ошибка в триггере / 20 сообщений из 20, страница 1 из 1
09.12.2019, 16:50
    #39900196
wearedogs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
есть for update триггер который при совпадении паспортов выдаёт ошибку, что паспорт не изменили. Нужно чтобы он просто выводил эту описанную ошибку, а то у меня даже не заходит в триггер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 = 'Петров Пётр Петрович'
...
Рейтинг: 0 / 0
09.12.2019, 16:56
    #39900209
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
wearedogs,

declare @Passport int

select @Passport = i.Passport from inserted i;


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

Код: sql
1.
SELECT * FROM  inserted


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


зы насчет rollbaсk tran В теле триггреа я НЕ уверен - но народ лучше скажет можно ли
...
Рейтинг: 0 / 0
09.12.2019, 17:02
    #39900222
wearedogs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Гулин Федор, не пашет
...
Рейтинг: 0 / 0
09.12.2019, 17:03
    #39900225
wearedogs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Гулин Федор, как можно изменить чтобы этот триггер и имел вывод при ошибке и он работал? Не подскажите?
...
Рейтинг: 0 / 0
09.12.2019, 17:12
    #39900238
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
wearedogs
меня даже не заходит в триггер
Странности не видите в строке:
Код: sql
1.
if @Passport =  @Passport 


wearedogs
Гулин Федор, не пашет
"Не пашет" должно выглядеть как сообщение об ошибке, ну или какое то внятное описание.
...
Рейтинг: 0 / 0
09.12.2019, 17:12
    #39900239
wearedogs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 = 'Петров Пётр Петрович'
...
Рейтинг: 0 / 0
09.12.2019, 17:20
    #39900248
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
wearedogs
есть for update триггер который при совпадении паспортов выдаёт ошибку, что паспорт не изменили

wearedogs
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 = 'Петров Пётр Петрович'

Нужно то что?
Это триггер проверяет номер паспорта на диапазон, хоть и неправильно.
...
Рейтинг: 0 / 0
09.12.2019, 17:29
    #39900263
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
я вот думаю что будет в
Код: sql
1.
select @Passport = i.Passport from inserted i;


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

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

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

но интересней что произойдет когда
where Full_Name in ( 'Петров Пётр Петрович' , 'Иванов .. ' , ...) -- несколькоз записей
...
Рейтинг: 0 / 0
09.12.2019, 17:36
    #39900277
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Гулин Федор
я вот думаю что будет в
Код: sql
1.
select @Passport = i.Passport from inserted i;


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

почему?
в переменную можно любое число строк слить.
останется в ней последнее туда попавшее
...
Рейтинг: 0 / 0
09.12.2019, 17:40
    #39900283
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
...
Рейтинг: 0 / 0
09.12.2019, 17:42
    #39900289
wearedogs
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
AndrF, спасибо!
...
Рейтинг: 0 / 0
09.12.2019, 17:47
    #39900301
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Строку с IF можно заменить на:

Код: sql
1.
	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)
...
Рейтинг: 0 / 0
09.12.2019, 17:48
    #39900304
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
wearedogs
AndrF, спасибо!

а ничего, что "рабочий" вариант проверял номер паспосрта на вхождение в диапазон,
а этот проверяет, изменили ли номер?
wearedogs
Господа, я был не внимателен. Было засрано пространство тремя прошлыми триггерами. Если что вот рабочий
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 = 'Петров Пётр Петрович'

...
Рейтинг: 0 / 0
09.12.2019, 17:50
    #39900309
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Yasha123
wearedogs
AndrF, спасибо!

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


Я дал ответ лишь на 1-вый вопрос темы, вообще-то...
...
Рейтинг: 0 / 0
09.12.2019, 17:53
    #39900313
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
так он написал, что у него бардак,
и это не есть актуальный триггер.

...просто он потом удивляется, что у него "в триггер не заходит".
ну если делать одни изменения, а ждать реакцию на совсем другие,
то да, покажется, что и "не заходит"
...
Рейтинг: 0 / 0
09.12.2019, 17:57
    #39900317
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Yasha123
...просто он потом удивляется, что у него "в триггер не заходит".
ну если делать одни изменения, а ждать реакцию на совсем другие,
то да, покажется, что и "не заходит"


Вот я и показал как сделать чтобы заходило. И, кстати, лучше обходиться без переменной @Passport - она совершенно не нужна.
...
Рейтинг: 0 / 0
09.12.2019, 17:58
    #39900319
iap
iap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
AndrF
Строку с IF можно заменить на:

Код: sql
1.
	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) по-вашему? Зачем это здесь?
...
Рейтинг: 0 / 0
09.12.2019, 17:59
    #39900320
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
Yasha123

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


Потому что только последнюю вы и проверите!
...
Рейтинг: 0 / 0
09.12.2019, 17:59
    #39900322
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
AndrF

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

смешно.
при любом апдэйте в триггер на апдэйт "зайдет".
...
Рейтинг: 0 / 0
09.12.2019, 18:02
    #39900326
Yasha123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ошибка в триггере
AndrF
Yasha123

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


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

мой ответ не вам, А Федору.
он считает, что будет ошибка при складывании тучи строк в переменную.
вы тоже так считаете и не согласны с тем,
что сложить в переменную можно сколько угодно строк?
про то "что будет проверено", в моем ответе ни слова нет
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ошибка в триггере / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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