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

Откуда: Москва
Сообщений: 567
Здравствуйте.
Возник вопрос такого плана. Хочется в хранимке реализовать удаление в 2х зависимых таблицах. Явной зависимости типа foreign key в этих таблицах нет. Соответственно, что бы в дальнейшем избежать возможные взаимные блокировки, не хочется делать 2 удаления в одной транзакции, хотя наверное придется, если не найду решения.

На абстрактном примере "методом тыка" получилось только такие манипуляции

declare @t1 table (i int)
declare @t2 table (i int)

insert @t1
output inserted.i into @t2
values (1),(2),(7),(8)

-- это еще работает, но если не инсерт то перестает работать
insert @t2
output inserted.i
select i
from
(
delete top(1) @t1
output deleted.i
) t

insert @t2
output inserted.i
select *
from
(
update @t1 set i+=10
output inserted.i
) t


а вот то что меня интересует:
delete from @t2
where i in 
(
delete from @t1
output inserted.i
where i=1
) t


Не хочет работать... Может кто знает, или ссылку даст на почитать, возможно ли решить эту задачу? Удалить одной командой из 2х таблиц...
23 янв 14, 12:46    [15456244]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
Удалить одной командой из 2х таблиц.

Это невозможно без каскадных операций

Алексей Куренков
Соответственно, что бы в дальнейшем избежать возможные взаимные блокировки, не хочется делать 2 удаления в одной транзакции, хотя наверное придется, если не найду решения.

Таблицы зависимы, но транзакций не хочу - это как понимать ?
23 янв 14, 12:49    [15456264]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Добрый Э - Эх
Guest
в существующих версиях MS SQL Server-а многотабличный DELETE, как класс DML-операций, отсутствует.
23 янв 14, 12:51    [15456273]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory,

Ну... нет форина - нет возможности каскадной операции...
А зависимость изначально есть, но форина нет, так уже было спроектировано... когда 1 поле таблицы может ссылаться не на одну таблицу а или на одну или на другую...
23 янв 14, 12:52    [15456288]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
А зависимость изначально есть, но форина нет, так уже было спроектировано... когда 1 поле таблицы может ссылаться не на одну таблицу а или на одну или на другую...

Причем тут физическая зависимость ?
Если данные логически зависимы, то как без транзакции вы собрались сохранить эту зависимость при удалении ?
23 янв 14, 12:54    [15456307]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory,

Если одна команда, то транзакция не требуется. иначе - конечно транзакция... Собственно вопрос то изначально по объединению двух DML команд (не вставка) в одну
23 янв 14, 12:55    [15456319]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
Алексей Куренков
Соответственно, что бы в дальнейшем избежать возможные взаимные блокировки, не хочется делать 2 удаления в одной транзакции, хотя наверное придется, если не найду решения.

Объясните в чем разница между удалением данных из двух таблиц одной инструкцией (допустим, что это возможно без каскадных FK), которая все равно будет в транзакции и двумя инструкциями delete, обернутыми транзакцией?
23 янв 14, 12:56    [15456323]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
Если одна команда, то транзакция не требуется. иначе - конечно транзакция... Собственно вопрос то изначально по объединению двух DML команд (не вставка) в одну

И что, будет разница, если все равно транзакция будет на все время удаления ?
23 янв 14, 12:57    [15456335]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
invm
Объясните в чем разница между удалением данных из двух таблиц одной инструкцией (допустим, что это возможно без каскадных FK), которая все равно будет в транзакции и двумя инструкциями delete, обернутыми транзакцией?


возможные дидлоки скажем между возможными командами:
delete @t1 where i=@i
delete @t2 where i=@i


delete @t2 where i=@i
delete @t1 where i=@i
23 янв 14, 12:58    [15456345]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
возможные дидлоки скажем между возможными командами:

Дедлоки возможны всегда. Даже на одной команде одного коннекта.
23 янв 14, 13:01    [15456364]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Алексей Куренков,

удалять можно и в триггере
23 янв 14, 13:05    [15456395]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Алексей Куренков
возможные дидлоки скажем между возможными командами:


А почему не хотите удалять все время в одном порядке - например, сперва t1, потом t2?
23 янв 14, 13:07    [15456409]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
Алексей Куренков
возможные дидлоки скажем между возможными командами:
Ну так не допускайте обращений к таблицам в разном порядке. Это гораздо правильнее и проще, чем пытаться состряпать одну DML на две таблицы.

Но если это невозможно, напишите для таблиц instead of delete триггеры, в начале которых будет вызов sp_getapplock на один и тот же ресурс.
23 янв 14, 13:10    [15456433]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
invm,

Ну да, понятно что выход типа триггеры, каскадное удаление в форине это все есть... Просто подумал, что может и есть какие другие варианты... со вставкой же есть! Вопрос в принципе больше даже теоретический. В решении самое простое в транзакции делать 2 удаления и если вдруг кто додумается до другой последовательности - уже это пресекать...
23 янв 14, 13:24    [15456543]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
Просто подумал, что может и есть какие другие варианты... со вставкой же есть! Вопрос в принципе больше даже теоретический.

Вот интересно, почему вы думаете, что один запрос со множеством объектов является этаким монолитом с точки зрения блокировок ? Типа запрос начался и сразу на все объектах появились все конечные блокировки ?
23 янв 14, 13:39    [15456688]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory,

Даже не знаю что и ответить )))). Такое убеждение. Буду признателен за аргументированную информацию противоречащую этому убеждению. Я понимаю, что возможна эскалация, возможны блокировки на индексах..
В моем понимании если в таблице нет индексов, разве что кроме кластерного, и операции изменений идут мелкими порциями (т.е. не будет эффекта эскалации), то один запрос со множеством объектов является монолитом с точки зрения блокировок.
23 янв 14, 13:45    [15456746]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
Буду признателен за аргументированную информацию противоречащую этому убеждению.

TSQL - это декларативный язык
Вы пишите, что надо сделать серверу, а не как он должен это делать.
Сервер строит план выполнения, т.е. последовательность выполнения операций.
И сервер не будет блокировать что-то заранее, равно как и удерживать блокировки дольше нужного времени.
23 янв 14, 13:50    [15456807]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Алексей Куренков,

я вот по тем же граблям недавно прошелся
15404872
23 янв 14, 13:56    [15456856]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Glory,

Ну хорошо... на примере можете мне сказать например есть такие таблицы
create table tmaster (id int primary key)
create table tdetail (id int primary key)

alter table tdetail add constraint fkmaster
    foreign key (id) references dbo.tmaster(id)
    on delete cascade

insert tmaster values (1),(2),(3),(4)
insert tdetail values (1),(2),(3),(4)


исполняем такой скрипт (как вы и предлагали ранее каскадное удаление), в котором не 2мя а одной операцией удаление идет:
set showplan_xml on

delete from tmaster where id = 2


теперь мне вот не понятно какой иной скрипт может вызвать взаимную блокировку? При условии частых удалений вместе с каскадными.
23 янв 14, 14:53    [15457262]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Алексей Куренков
теперь мне вот не понятно какой иной скрипт может вызвать взаимную блокировку?

да точно такой же, как
delete @t2 where i=@i
delete @t1 where i=@i

т.е. тот, который будет блокировать в неправильном порядке
Главное, чтобы по-времени команды совпали.
23 янв 14, 14:59    [15457315]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Cygapb-007
Member

Откуда:
Сообщений: 1677
оффтопом:)
дословно, синтаксис удаления нескольких таблиц в одной команде следующий:
drop table table1, table2, ...
23 янв 14, 15:08    [15457384]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
Алексей Куренков
Member [заблокирован]

Откуда: Москва
Сообщений: 567
Cygapb-007,

Ну да... дословно я тему не правильно написал. что в общем то из текста всем понятно стало... удаление не самих таблиц а данных из нескольких таблиц... ))))
23 янв 14, 15:11    [15457402]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
Алексей Куренков
Если одна команда, то транзакция не требуется. иначе - конечно транзакция...
Удаление без транзакции сделать не получится, по крайней мере в MS SQL Server
23 янв 14, 15:17    [15457461]     Ответить | Цитировать Сообщить модератору
 Re: интересует синтаксис удаления нескольких таблиц в одной команде?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34696
Алексей Куренков
возможные дидлоки скажем между возможными командами:


Интересно... про дедлоки парень знает, а что такого в принципе в SQL нет (да и не нужно) -- не знает...
23 янв 14, 20:31    [15459392]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить