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

Откуда:
Сообщений: 355
Есть триггер.

create trigger tr_testtable
on testtable
for insert
as

Дальше в триггере я хочу проверять какое-то условие, и если это условие выполняется, то отменять вставку.

В какую сторону смотреть ?
26 авг 04, 14:09    [910457]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
В сторону rollback и raiserror
26 авг 04, 14:09    [910462]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Согласен
Guest
и еще в сторону Instead Of триггера, тогда может и вставку отменять не придется
26 авг 04, 14:11    [910474]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Осирис
Member

Откуда:
Сообщений: 355
Есть таблица с полем dt (datetime). Нужно сделать так, чтобы нельзя было создать два поля с одним годом.

Если делать через триггер (другие варианты пока не рассматриваю), насколько удачен такой вариант:

create trigger tr_testtable
on testtable
for insert, update
as
  declare @cnt as int
  select @cnt = count(*) from testtable, inserted where year(testtable.dt) = year(inserted.dt)
  if (@cnt > 1) rollback


Посоветуйте и покритекуйте ;)
26 авг 04, 14:25    [910576]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37101
Осирис
Есть таблица с полем dt (datetime). Нужно сделать так, чтобы нельзя было создать два поля с одним годом.

Если делать через триггер (другие варианты пока не рассматриваю), насколько удачен такой вариант:

create trigger tr_testtable
on testtable
for insert, update
as
  declare @cnt as int
  select @cnt = count(*) from testtable, inserted where year(testtable.dt) = year(inserted.dt)
  if (@cnt > 1) rollback


Посоветуйте и покритекуйте ;)

Вычислемое поле + уникальный индекс.
P.S.
if exists( select * from testtable, inserted where year(testtable.dt) = year(inserted.dt) ) rollback
26 авг 04, 14:28    [910593]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Если индекс на вычисляемое поле уникальный, то он даже и вставить/изменить не даст, до триггера и не доедет.
26 авг 04, 14:31    [910614]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Осирис
Member

Откуда:
Сообщений: 355
Эх.... написал же...

Если делать через триггер (другие варианты пока не рассматриваю), насколько удачен такой вариант:


Предложенный Вами вариант я рассматриваю здесь https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=117497&pg=-1
26 авг 04, 14:31    [910618]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Осирис
Эх.... написал же...

Если делать через триггер (другие варианты пока не рассматриваю), насколько удачен такой вариант:


Предложенный Вами вариант я рассматриваю здесь https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=117497&pg=-1
Совсем неудачен - будет сканирование таблицы, даже если по этой колоке будет индекс. А вот с вычисляемой и с уникальным индексом - рулез.
26 авг 04, 14:35    [910653]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Осирис
Member

Откуда:
Сообщений: 355
Еще читал про "пользовательскую функцию привязать к check constraint". Если не сложно - поясните этот момент. Хотя бы ссылкой на раздел BOL.
26 авг 04, 14:54    [910801]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
aleks2
Guest
CREATE FUNCTION dbo.f_Check_ControllerID
	(@N int, @SN tSerialN)
RETURNS int
AS
	BEGIN
	RETURN (SELECT @id=ID
		FROM    dbo.controller
		WHERE  (SerialN = ISNULL(LTRIM(RTRIM(@SN)),'')) AND (ControllerN = @N) )
	END

CREATE TABLE [Counter] (
	[CounterID] [int] IDENTITY (1, 1) NOT NULL ,
	[СontrollerN] [int] NULL CONSTRAINT [DF_Counter_СontrollerN] DEFAULT (0),
	[SerialN] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL CONSTRAINT [DF_Counter_SerialN_1] DEFAULT (N''),

	CONSTRAINT [CK_Counter_ControllerNotExists] CHECK ([dbo].[f_Check_ControllerID]([СontrollerN], [SerialN]) is not null),

) ON [PRIMARY]
GO
26 авг 04, 15:06    [910862]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Осирис
Member

Откуда:
Сообщений: 355
Хм.... получается, что применить этот способ для своей задачи я не смогу ?

Есть таблица с полем dt (datetime). Нужно сделать так, чтобы нельзя было создать две строки с одним годом.


Получается, что функция должна обращаться к таблице, на которую мы навешиваем CONSTRAINT, что в принципе не возможно.

Или все-таки есть способ ?
26 авг 04, 15:14    [910911]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
aleks2
Guest
>>Получается, что функция должна обращаться к таблице, на которую мы навешиваем CONSTRAINT, что в принципе не возможно.

Это можно.
26 авг 04, 15:18    [910943]     Ответить | Цитировать Сообщить модератору
 Re: Как в триггере на insert, update отменить вставку/изменение  [new]
Осирис
Member

Откуда:
Сообщений: 355
Спасибо. Разобрался.
26 авг 04, 15:24    [910990]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить