Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как ограничить объем генерируемых изменений одной транзакцией?  [new]
ограничить объем
Guest
Как ограничить объем генерируемых изменений одной транзакцией, чтобы при его привышении она автоматически откатывалась?
19 авг 12, 15:50    [13033322]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить объем генерируемых изменений одной транзакцией?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Автоматически - никак. Считайте, сколько данных в транзакции модифицировали, если превысили - rollback.
19 авг 12, 15:52    [13033327]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить объем генерируемых изменений одной транзакцией?  [new]
aleks2
Guest
set rowcount nnn

Не совсем полное щастье, но максимум доступного.
19 авг 12, 16:16    [13033385]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить объем генерируемых изменений одной транзакцией?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
aleks2
set rowcount nnn
Но сам же M$ советует воспользоваться оператором TOP в соответствующей команде.
К примеру:
UPDATE	Top(1001) T
SET	Col = <Expr>
FROM	dbo.SomeTable
WHERE	<Filter>

IF (@@RowCount > 1000) BEGIN
	ROLLBACK
	RAISERROR('Слишком много данных для изменения',18,1)
	RETURN @@Error
END
20 авг 12, 02:45    [13034832]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить объем генерируемых изменений одной транзакцией?  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 420
UPDATE	Top(1001) T
SET	Col = <Expr>
FROM	dbo.SomeTable
WHERE	<Filter>


Передвнесеием изменений можно проверить, сколько данных удовлетворяют условию, и начинать вносить изменения только тогда, когда количество записей Вам подходит:

IF (SELECT COUNT(T) FROM 	dbo.SomeTable  WHERE <Filter>) < @Num
BEGIN
UPDATE	Top(1001) T
SET	Col = <Expr>
FROM	dbo.SomeTable
WHERE	<Filter>
END
ELSE
BEGIN
ROLLBACK
RAISERROR('Слишком много данных для изменения',18,1)
RETURN @@Error
END
20 авг 12, 15:17    [13037518]     Ответить | Цитировать Сообщить модератору
 Re: Как ограничить объем генерируемых изменений одной транзакцией?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727
Александр Бердышев, в вашем примере не эффективно - 2 раза пробегаться, более того, может дать разный результат - т.е. банально нарушаете принцип указанного IL. Но если заранее известно (к примеру по @@RowCount с предыдущей команды или с клиента приходит ...) то естественно лучше заранее проверить.

Если эта "ошибка" срабатывает редко (в одном случае из 100, к примеру), то у вас нагрузка увеличится где-то в 2 попугая раз, из-за принудительного лишнего чтения.
20 авг 12, 21:57    [13039696]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить