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

Откуда:
Сообщений: 8
Доброго времени суток.
люди добрые, помогите пожалуйста с написание простого триггера на апдейт.

суть триггера заключается в том, чтоб не давать обновлять таблицу, если значение одного из столбцов = 4.
есть таблица requests, в которой поле id_status и таблица status c полем id.
Подскажите пожалуйста в чем ошибка?

create trigger trig1 on requests
for update as
if (update(id_status = '4')
begin
rollback transaction
print 'error!'
end
16 авг 11, 11:49    [11125161]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
В том, что вы придумали синтаксис.
16 авг 11, 11:50    [11125174]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
UPDATE ( column )


Arguments
column
Is the name of the column to test for either an INSERT or UPDATE action. Because the table name is specified in the ON clause of the trigger, do not include the table name before the column name. The column can be of any data type supported by SQL Server. However, computed columns cannot be used in this context.

Развк id_status = '4' - это имя поля ?
16 авг 11, 11:51    [11125193]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
Glory,

id_status это столбец в таблице requests.
16 авг 11, 11:53    [11125210]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
glinch1991
id_status это столбец в таблице requests.

Ну тогда почему в функции не имя столбца, а выражение id_status = '4' ?
16 авг 11, 11:54    [11125230]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
glinch1991,

create trigger trig1 on requests
after update as
begin
if (deleted.\inserter. id_status = '4')
....
end
16 авг 11, 11:55    [11125237]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
Slava_Nik,

Incorrect syntax near '.'.
16 авг 11, 11:59    [11125296]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
Glory,

id_status это имя столбца, если в этом столбце значение "4", то триггер не даст обновить этот же столбец на другое значение..3,2..
16 авг 11, 12:04    [11125358]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31980
Slava_Nik
glinch1991,

create trigger trig1 on requests
after update as
begin
if (deleted.\inserter. id_status = '4')
....
end
Ого! Ну и синтаксис :-)

glinch1991
id_status это столбец в таблице requests.
Функция update вам не подойдёт.

Вам нужно, используя таблицы inserted и deleted, сравнить значения полей id_status, и если в новых записях появились значения 4, откатить транзакцию.
16 авг 11, 12:08    [11125392]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Slava_Nik
Member

Откуда: из России
Сообщений: 901
alexeyvg,

так у него не понятно в задаче, на что срабатывать триггер, если вставляемое значение равно 4 или текущее значение равно 4.
16 авг 11, 12:13    [11125444]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
[/quot]
так у него не понятно в задаче, на что срабатывать триггер, если вставляемое значение равно 4 или текущее значение равно 4.[/quot]
когда текущее значение 4.
16 авг 11, 12:21    [11125512]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
glinch1991
когда текущее значение 4.

а если обновляется 100 записей и только у одной из них "текущее значение 4" ?
16 авг 11, 12:25    [11125543]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
iljy
Member

Откуда:
Сообщений: 8711
Slava_Nik
alexeyvg,

так у него не понятно в задаче, на что срабатывать триггер, если вставляемое значение равно 4 или текущее значение равно 4.

Это что, повод писать хрень?

glinch1991,

распишите предполагаемую логику работы триггера. Полностью. Тогда и ответ быстро получите.
16 авг 11, 12:27    [11125558]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
Уленшпигель
Member

Откуда:
Сообщений: 115
glinch1991,

а в обновляемых строках есть какой-нибудь уникальный ключ, который точно не обновляется?
16 авг 11, 12:35    [11125619]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
alexeyvg,

спасибо разобрался. проблема решена.


CREATE TRIGGER trig ON requests
AFTER update
AS
DECLARE @id_status int
IF not EXISTS (SELECT *
FROM requests p
JOIN inserted AS i
ON p.id_status = i.id_status
WHERE p.id_status = 4
)
BEGIN
print 'error!'
ROLLBACK TRANSACTION;
RETURN
END;
16 авг 11, 12:40    [11125671]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
Уленшпигель,

да есть.
16 авг 11, 12:40    [11125676]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
glinch1991
alexeyvg,

спасибо разобрался. проблема решена.


CREATE TRIGGER trig ON requests
AFTER update
AS
DECLARE @id_status int
IF not EXISTS (SELECT *
FROM requests p
JOIN inserted AS i
ON p.id_status = i.id_status
WHERE p.id_status = 4
)
BEGIN
print 'error!'
ROLLBACK TRANSACTION;
RETURN
END;
Чо за хрень?
А @id_status зачем объявлен?
В inserted - не текущие, а новые значения, Вы в курсе?
JOIN inserted с таблицей - это полный абсурд, ибо они совпадают!
В каждой строчке inserted совпадают.
То Вы говорили, что если 4, то апдейтить не надо.
А то пишете ROLLBACK, если 4-ки как раз-таки нет (not EXISTS)?!
16 авг 11, 12:45    [11125712]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
glinch1991
Member

Откуда:
Сообщений: 8
iap,

я попытался переделать пример, представленный здесь http://msdn.microsoft.com/ru-ru/library/ms191300.aspx
у меня все заработало как надо. По поводу абсурда я в курсе. спасибо.
16 авг 11, 12:49    [11125762]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на запрет обновления строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
glinch1991
iap,

я попытался переделать пример, представленный здесь http://msdn.microsoft.com/ru-ru/library/ms191300.aspx
у меня все заработало как надо. По поводу абсурда я в курсе. спасибо.
CREATE TRIGGER trig ON requests AFTER UPDATE AS
IF EXISTS(SELECT * deleted WHERE id_status=4)
BEGIN
 RAISERROR('Какое-нибудь умное сообщение',16,0);
 ROLLBACK TRANSACTION;
END;
16 авг 11, 13:09    [11125935]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить