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

Откуда:
Сообщений: 40
Есть таблица Платежи, у таблицы Платежи есть поле Дата_платежа, в задании требуется написать триггер , который бы запрещал добавлять платеж по воскресеньям. Код триггера
Код T-SQL
ALTER TRIGGER [dbo].[proverka_plat]
ON [dbo].[Платежи]
FOR INSERT  
AS
DECLARE @data datetime
DECLARE @data2 nvarchar(15)
set @data = (select Дата_платежа from inserted)
IF  datename(day,@data) in ('Sunday')
begin 
print 'Запрещено добавлять платежи в воскресенье'
rollback transaction
end


Триггер компилируется без ошибок, но не действует. При добавлении строки с датой например: 2015-03-22, строка без проблем добавляется! В чем может быть проблема?
25 мар 15, 09:26    [17427934]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
>>set @data = (select Дата_платежа from inserted)

если добавлю 3 записи, то какую дату вы проверять будите в своём триггере? ;)))
25 мар 15, 09:33    [17427960]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Knyazev Alexey
>>set @data = (select Дата_платежа from inserted)

если добавлю 3 записи, то какую дату вы проверять будите в своём триггере? ;)))
Никакую!
Ибо завершится на этом месте с ошибкой.

Однако, очень знакомый текст... Вам разве не дали ответ на другом форуме?

Offtop. Удивляюсь преподавателям SQL. Ничему не учат. Ничего не рассказывают. Ничего не объясняют. Им бы самим учиться и учиться...
25 мар 15, 09:41    [17427982]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алекс-Могилев
В чем может быть проблема?

В том, что условие IF вычисляет не то, что вы предполагаете.
25 мар 15, 10:01    [17428062]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Алекс-Могилев
Member

Откуда:
Сообщений: 40
iap, Ответ-то дали но у меня все равно ничего не получается(((
25 мар 15, 10:06    [17428089]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алекс-Могилев
но у меня все равно ничего не получается(((

Научитесь пользоваться отладочными выводами.
Например, узнайте, а что возвращает вам datename(day,@data)
25 мар 15, 10:08    [17428101]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
Еще неплохо научиться читать FAQ:

https://www.sql.ru/faq/faq_topic.aspx?fid=998
25 мар 15, 10:12    [17428137]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Алекс-Могилев
Member

Откуда:
Сообщений: 40
Glory,
Идея хорошая, но тут и так по ходу ошибок куча. Но я не могу понять что делать вот с этой строкой
set @data = (select Дата_платежа from inserted)
, как тут что проверять
25 мар 15, 10:13    [17428142]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10234
Блог
Алекс-Могилев
Glory,
Идея хорошая, но тут и так по ходу ошибок куча. Но я не могу понять что делать вот с этой строкой
set @data = (select Дата_платежа from inserted)

, как тут что проверять


if exists ( select * from inserted where Дата_платежа подходит под какое-то условие ваше )
rollback
25 мар 15, 10:17    [17428168]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алекс-Могилев
, как тут что проверять

Руками написать отладочный вывод
25 мар 15, 10:24    [17428214]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Алекс-Могилев
Member

Откуда:
Сообщений: 40
Knyazev Alexey,
Используя вашу конструкцию я должен проверить условие, но мне вот с этим не совсем понятно. Если я INSERTOM буду добавлять запись положим '2015-03-25' . Мне не совсем понятно какое тут условие
25 мар 15, 10:30    [17428248]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
Алекс-Могилев
Мне не совсем понятно какое тут условие

Такое же, как в if
Вы прикидываетесь что ли ?
25 мар 15, 10:34    [17428270]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Алекс-Могилев
Knyazev Alexey,
Используя вашу конструкцию я должен проверить условие, но мне вот с этим не совсем понятно. Если я INSERTOM буду добавлять запись положим '2015-03-25' . Мне не совсем понятно какое тут условие
Одним INSERTом вставляем 5 правильных строк и 5 неправильных.
Что делаем?
1. Ничего не вставляем (ROLLBACK всей транзакции)?
2. Вставляем только правильные, неправильные игнорируем?

От ответа зависит стратегия обработки записей в триггере.
25 мар 15, 10:36    [17428290]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
гр к
Guest
Я правильно понимаю, что нужно обязательно строку
set language english
в триггер включить, чтобы можно было проверять условие
datename(dw,@data) in ('Sunday')

и дата вида '2015-03-22' корректно отработалась?
25 мар 15, 12:23    [17429079]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
гр к
Я правильно понимаю, что нужно обязательно строку
set language english

в триггер включить, чтобы можно было проверять условие

Правильнее писать код, который не зависит от региональных настроек и сервера и клиента
25 мар 15, 12:25    [17429089]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
гр к
Guest
Glory
гр к
Я правильно понимаю, что нужно обязательно строку
set language english

в триггер включить, чтобы можно было проверять условие

Правильнее писать код, который не зависит от региональных настроек и сервера и клиента

Подскажите, как это сделать, если нужно как в примере именно день недели определить?
С датой понятно - написал в независящем от языка формате типа 'yyyymmdd', а как с днями недели?
set language us_english;
select datepart(dw,'20150322')
--1
set language russian;
select datepart(dw,'20150322')
--7
25 мар 15, 12:44    [17429247]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
гр к
Glory
пропущено...

Правильнее писать код, который не зависит от региональных настроек и сервера и клиента

Подскажите, как это сделать, если нужно как в примере именно день недели определить?
С датой понятно - написал в независящем от языка формате типа 'yyyymmdd', а как с днями недели?
set language us_english;
select datepart(dw,'20150322')
--1
set language russian;
select datepart(dw,'20150322')
--7
SELECT DATEDIFF(DAY,0,'20150322')%7;
25 мар 15, 12:47    [17429270]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Glory
Member

Откуда:
Сообщений: 104760
гр к
С датой понятно - написал в независящем от языка формате типа 'yyyymmdd', а как с днями недели?

Нормальные люди делают таблицу-календарь
Можно использовать формулу, которую публиковали на форуме
25 мар 15, 12:50    [17429296]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
ALTER TRIGGER [dbo].[proverka_plat]
ON [dbo].[Платежи]
FOR INSERT  
AS
IF EXISTS (SELECT 1 FROM INSERTED WHERE DATEDIFF(DD, 0, [Дата_Платежа]) % 7 = 6) BEGIN
    PRINT 'Запрещено добавлять платежи в воскресенье'
    ROLLBACK TRANSACTION
END
25 мар 15, 14:23    [17430037]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
Алекс-Могилев
Member

Откуда:
Сообщений: 40
Вот как оно должно было быть оказывается! Спасибо большое
25 мар 15, 14:39    [17430196]     Ответить | Цитировать Сообщить модератору
 Re: Помощь с триггером  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
felix_ff
ALTER TRIGGER [dbo].[proverka_plat]
ON [dbo].[Платежи]
FOR INSERT  
AS
IF EXISTS (SELECT 1 FROM INSERTED WHERE DATEDIFF(DD, 0, [Дата_Платежа]) % 7 = 6) BEGIN
    PRINT 'Запрещено добавлять платежи в воскресенье'
    ROLLBACK TRANSACTION
END
А ещё проще - INSTEAD OF INSERT. Однако, будьте осторожны с определением всавленного IDENTITY в этом случае!
ALTER TRIGGER [dbo].[proverka_plat] ON [dbo].[Платежи] INSTEAD OF INSERT AS
IF EXISTS(SELECT * FROM inserted WHERE DATEDIFF(DD, 0, [Дата_Платежа]) % 7 = 6)
 RAISERROR('Запрещено добавлять платежи в воскресенье',16,0,0)
ELSE
 INSERT [dbo].[Платежи](<СписокПолей>) SELECT <СписокПолей> FROM inserted;
GO

<СписокПолей> - это все поля, которые не-IDENTITY, невычисляемые, не-TIMESTAMP (ROWVERSION)
25 мар 15, 14:46    [17430258]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить