powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ошибка в триггере
20 сообщений из 20, страница 1 из 1
Ошибка в триггере
    #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
Ошибка в триггере
    #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
Ошибка в триггере
    #39900222
wearedogs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор, не пашет
...
Рейтинг: 0 / 0
Ошибка в триггере
    #39900225
wearedogs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор, как можно изменить чтобы этот триггер и имел вывод при ошибке и он работал? Не подскажите?
...
Рейтинг: 0 / 0
Ошибка в триггере
    #39900238
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wearedogs
меня даже не заходит в триггер
Странности не видите в строке:
Код: sql
1.
if @Passport =  @Passport 


wearedogs
Гулин Федор, не пашет
"Не пашет" должно выглядеть как сообщение об ошибке, ну или какое то внятное описание.
...
Рейтинг: 0 / 0
Ошибка в триггере
    #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
Ошибка в триггере
    #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
Ошибка в триггере
    #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
Ошибка в триггере
    #39900277
Фотография Yasha123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
я вот думаю что будет в
Код: sql
1.
select @Passport = i.Passport from inserted i;


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

почему?
в переменную можно любое число строк слить.
останется в ней последнее туда попавшее
...
Рейтинг: 0 / 0
Ошибка в триггере
    #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
Ошибка в триггере
    #39900289
wearedogs
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndrF, спасибо!
...
Рейтинг: 0 / 0
Ошибка в триггере
    #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
Ошибка в триггере
    #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
Ошибка в триггере
    #39900309
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123
wearedogs
AndrF, спасибо!

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


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

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


Вот я и показал как сделать чтобы заходило. И, кстати, лучше обходиться без переменной @Passport - она совершенно не нужна.
...
Рейтинг: 0 / 0
Ошибка в триггере
    #39900319
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
Ошибка в триггере
    #39900320
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yasha123

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


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

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

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

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


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

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


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