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

Откуда: С-Пб
Сообщений: 516
Нужно сделать следующее: при удалении строки с определенным номером вести лог этих номеров, чтобы если затем пользователь попопытается добавить опять строку с этим (ранее пользованным) номером, не допустить этого.

Я вижу это так:
1. триггер на delete after для записи этого номера в отдельную таблицу
2. триггер на insert instead of - если номер уже использован (есть в таблице), то ROLLBACK TRANSACTION

Может быть, можно как-то лучше?
27 май 05, 11:24    [1575530]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
автор
триггер на insert instead of - если номер уже использован (есть в таблице), то ROLLBACK TRANSACTION

если использовать insert instead of - то откатывать ничего не надо
те либо after + rollback(тогда остальные тоже не вставятся)
либо insert instead of - и вставлять только те, которых нет в логе
это уже на ваше усмотрение
можно ещё строки помечать, как удалённые, но возможность такого подходя сильно зависит от реализации и от уже написанных клиентов
27 май 05, 11:27    [1575554]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
а могет лучше не триггерами табличку нагружать а сделать нормальное добавление данных...

ваш "номер" - это int IDENTITY?

моно ловить его типа SELECT MAX(ID) FROM ...

или SELECT @@IDENTITY

или SCOPE_IDENTITY( )

в зависимости от задачи...

кстати в поиске про это много моно накопать
27 май 05, 11:31    [1575568]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
M0us
Member

Откуда: Moscow
Сообщений: 883
сорри, невнимательно в вопрос вчитался...

Нужно сделать следующее: при удалении строки с определенным номером вести лог этих номеров, чтобы если затем пользователь попопытается добавить опять строку с этим (ранее пользованным) номером, не допустить этого.


лучше в отдельной таллице хранить только ID. тогда это можно и к триггеру привязать... или проверку из ХП делать перед добавлением...

отдельная таблица - экономично
27 май 05, 11:33    [1575578]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
Andrey Ts
Member

Откуда: С-Пб
Сообщений: 516
Smirnov Anton

...
after + rollback(тогда остальные тоже не вставятся)

Выбрал такой вариант. Все отрабатывает, только при откате еще надо чтобы юзер получил сообщение об ошибке, а он ничего не получает. Как это лучше сделать?
27 май 05, 12:18    [1575797]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
RAISERROR
И еще....
В Delphi+ADO почему-то если RAISERROR возникает в триггере, а не непосредственно в вызванной процедуре для того, чтобы этот RAISERROR "дошел до клиента", нужно обязательно делать
ADOStoredProc1.Open;
соответственно, нужно делать хоть какой-то SELECT в конце SP

При использовании ADOStoredProc1.Exec RAISERROR в триггере почему-то не вызывает Exception в Delphi
27 май 05, 13:17    [1576122]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
Andrey Ts
Member

Откуда: С-Пб
Сообщений: 516
Спасибо.
RAISERROR действительно спас отца русской демократии ;))
Еще хочется вести лог (в отдельной таблице) таких неудачных попыток - номер, кто, когда попытался\ вновь добавить строку, но если делаю это в триггере, напр:
 insert bad_try (polnum)   select polnum from inserted
то ничего в bad_try не пишется. Видимо, из-за ROLLBACK TRAN в триггере. И как это обойти?
27 май 05, 13:28    [1576178]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Andrey Ts
Спасибо.
RAISERROR действительно спас отца русской демократии ;))
Еще хочется вести лог (в отдельной таблице) таких неудачных попыток - номер, кто, когда попытался\ вновь добавить строку, но если делаю это в триггере, напр:
 insert bad_try (polnum)   select polnum from inserted
то ничего в bad_try не пишется. Видимо, из-за ROLLBACK TRAN в триггере. И как это обойти?

Коллега работает в медицине? ;)

Можно попробовать вот так:

DECLARE @CMD varchar(200), @polnum varchar(17)
SET @Polnum='770000 1234567890'
SET @CMD = 'echo ' + @Polnum + ' >> c:\123.123'
exec master..xp_cmdshell @CMD
27 май 05, 13:46    [1576268]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
еще можно попробовать что-то типа
RAISERROR ('Polnum=%s', 16, 1, @polnum) WITH LOG
27 май 05, 13:49    [1576286]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
добавляешь записи о том, что была попытка в табличную переменную, затем делаешь rollback и вставляешь данные из табличной переменной в таблицу лога попыток. Фишка в том, что табличные переменные нетранзакционны, поэтому данные между разными транзакциями можно хранить в них :)
27 май 05, 14:00    [1576339]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
Все равно "некрасиво" :)
У меня, например, клиенты все транзакции принудительно объявляют и откатывают. В таком случае что в триггере не делай, если RAISERROR - все равно откатится.
27 май 05, 14:05    [1576371]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
Andrey Ts
то ничего в bad_try не пишется. Видимо, из-за ROLLBACK TRAN в триггере. И как это обойти?

Еще и так можно обойти Обработка исключительных ситуаций в T-SQL
27 май 05, 14:14    [1576407]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
Andrey Ts
Member

Откуда: С-Пб
Сообщений: 516
AAron
добавляешь записи о том, что была попытка в табличную переменную, затем делаешь rollback и вставляешь данные из табличной переменной в таблицу лога попыток. Фишка в том, что табличные переменные нетранзакционны, поэтому данные между разными транзакциями можно хранить в них :)

Оно самое. Спасибо.
27 май 05, 14:17    [1576424]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить вставку записей с определенным номером?  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
А не лучше ли не удалять запись, а ставить флаг что она удалённая(триггер instead of delete)? Тогда и отдельных табличек не надо, и проверяться будет на уровне уникальности индекса
27 май 05, 14:43    [1576585]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить