Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
Гулин Федор Member Откуда: МИНСК Сообщений: 1298 |
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] Ответить | Цитировать Сообщить модератору |
wearedogs Member Откуда: Сообщений: 13 |
Гулин Федор, не пашет |
9 дек 19, 17:02 [22036017] Ответить | Цитировать Сообщить модератору |
wearedogs Member Откуда: Сообщений: 13 |
Гулин Федор, как можно изменить чтобы этот триггер и имел вывод при ошибке и он работал? Не подскажите? |
9 дек 19, 17:03 [22036020] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
if @Passport = @Passport
|
||||||||
9 дек 19, 17:12 [22036034] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
Это триггер проверяет номер паспорта на диапазон, хоть и неправильно. |
||||||||
9 дек 19, 17:20 [22036045] Ответить | Цитировать Сообщить модератору |
Гулин Федор Member Откуда: МИНСК Сообщений: 1298 |
я вот думаю что будет в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] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
почему? в переменную можно любое число строк слить. останется в ней последнее туда попавшее |
||||
9 дек 19, 17:36 [22036083] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
wearedogs Member Откуда: Сообщений: 13 |
AndrF, спасибо! |
9 дек 19, 17:42 [22036097] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
а ничего, что "рабочий" вариант проверял номер паспосрта на вхождение в диапазон, а этот проверяет, изменили ли номер?
|
||||||||
9 дек 19, 17:48 [22036112] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
Я дал ответ лишь на 1-вый вопрос темы, вообще-то... |
||||||||
9 дек 19, 17:50 [22036117] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
так он написал, что у него бардак, и это не есть актуальный триггер. ...просто он потом удивляется, что у него "в триггер не заходит". ну если делать одни изменения, а ждать реакцию на совсем другие, то да, покажется, что и "не заходит" |
9 дек 19, 17:53 [22036121] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
Вот я и показал как сделать чтобы заходило. И, кстати, лучше обходиться без переменной @Passport - она совершенно не нужна. |
||||
9 дек 19, 17:57 [22036125] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||||
9 дек 19, 17:58 [22036127] Ответить | Цитировать Сообщить модератору |
AndrF Member Откуда: Сообщений: 2194 |
Потому что только последнюю вы и проверите! |
||||
9 дек 19, 17:59 [22036128] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
смешно. при любом апдэйте в триггер на апдэйт "зайдет". |
||||
9 дек 19, 17:59 [22036130] Ответить | Цитировать Сообщить модератору |
Yasha123 Member Откуда: Сообщений: 1955 |
мой ответ не вам, А Федору. он считает, что будет ошибка при складывании тучи строк в переменную. вы тоже так считаете и не согласны с тем, что сложить в переменную можно сколько угодно строк? про то "что будет проверено", в моем ответе ни слова нет |
||||||||
9 дек 19, 18:02 [22036134] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |