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

Откуда:
Сообщений: 20504
Добрый день!
Задача получить копию данных из двух таблиц в 2 временные таблицы.
Таблицы связаны как 1 ко многим.
Если делать по очереди копию данных сначала из одной таблицы, потом из другой, то можно попаст в ситуацию,
когда запись во второй таблице будет привязана к несуществующей записи в первой таблице.

Как этого избежать?
Вроде транзакции здесь ни о чём.
Какой механизм применяется в данном случае?
4 сен 13, 15:32    [14794796]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
defragmentator
Вроде транзакции здесь ни о чём.

ето почему ? можно и так ,а можно и иначе при запонеии второй таблицы просто использовать join/exist
4 сен 13, 15:35    [14794809]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Maxx
defragmentator
Вроде транзакции здесь ни о чём.

ето почему ? можно и так ,а можно и иначе при запонеии второй таблицы просто использовать join/exist


Если при заполнении второй таблицы использовать JOIN с оригинальной первой, то можно получить ссылки на данные, не закачанные в копию первой.
А если джойнить с копией первой, то да, на первый взгляд битых ссылок не будет.
4 сен 13, 15:41    [14794850]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Maxx
Member [скрыт]

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

Если есть ФК на таблицах - то вы точно не получите в копиях записи с несуществующим отношением
Записей то сколько вообще в 2х таблицах ?
4 сен 13, 15:44    [14794870]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

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

Получу ошибку.
100 К записей во второй таблице
4 сен 13, 15:54    [14794941]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
если одноразовое выгрузите все 1 транзакции и всех делов
4 сен 13, 15:57    [14794974]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

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

мне нужен механизм, который бы позволял без ошибок получить копию 2-х связанных таблиц
4 сен 13, 16:03    [14795019]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
defragmentator
мне нужен механизм, который бы позволял без ошибок получить копию 2-х связанных таблиц
TIL Snapshot;
Database snapshot.
4 сен 13, 16:18    [14795155]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
invm
TIL Snapshot;
Database snapshot.

Это всю БД целиком копирует?
4 сен 13, 16:29    [14795256]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
defragmentator
invm
TIL Snapshot;
Database snapshot.

Это всю БД целиком копирует?

TIL = Transaction Isolation Level. Никакую БД никуда не копирует.
Про Database Snapshot можно прочитать, например, здесь: http://technet.microsoft.com/ru-ru/library/ms187054(v=sql.105).aspx
4 сен 13, 16:35    [14795308]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
1. разрешить для базы снапшот
2. как-то так

create table # -- лучше, все же, до начала транзакции

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN

-- тут ваша выгрузка
-- 100% гарантия целостности данных

COMMIT

3. profit
4 сен 13, 17:09    [14795537]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
aleks2
Guest
Crimean
1. разрешить для базы снапшот
2. как-то так

create table # -- лучше, все же, до начала транзакции

SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN

-- тут ваша выгрузка
-- 100% гарантия целостности данных

COMMIT

3. profit


Ну... из пушек по воробьям
begin transaction
-- полагаем #t1 -< #t2
select t2.* into #Copy2 from #t1 t1 with (xlock, tablock, holdlock) inner join #t2 t2 with (xlock, tablock, holdlock) on t1.id = t2.id
select t1.* into #Copy1 from #t1 t1;
commit
5 сен 13, 07:07    [14797048]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
aleks2
begin transaction
-- полагаем #t1 -< #t2
select t2.* into #Copy2 from #t1 t1 with (xlock, tablock, holdlock) inner join #t2 t2 with (xlock, tablock, holdlock) on t1.id = t2.id
select t1.* into #Copy1 from #t1 t1;
commit

В это время пользователи бьются головой об клавиатуру, а за спиной defragmentator вырастает DBA с топором.
5 сен 13, 08:42    [14797156]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
aleks2
Guest
Гость333
aleks2
begin transaction
-- полагаем #t1 -< #t2
select t2.* into #Copy2 from #t1 t1 with (xlock, tablock, holdlock) inner join #t2 t2 with (xlock, tablock, holdlock) on t1.id = t2.id
select t1.* into #Copy1 from #t1 t1;
commit

В это время пользователи бьются головой об клавиатуру, а за спиной defragmentator вырастает DBA с топором.


Кто вас так запугал в детстве?
5 сен 13, 09:30    [14797354]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
aleks2
Кто вас так запугал в детстве?


кроме DBA с топором некому ))
5 сен 13, 09:38    [14797405]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
aleks2
begin transaction
-- полагаем #t1 -< #t2
select t2.* into #Copy2 from #t1 t1 with (xlock, tablock, holdlock) inner join #t2 t2 with (xlock, tablock, holdlock) on t1.id = t2.id
select t1.* into #Copy1 from #t1 t1;
commit
Не выспамшись? :)
begin tran;

declare @a int;

select top (0) @a = 0 from #t1 with (tablockx) cross join #t2 with (tablockx);

select t1.* into #Copy1 from #t1;
select t2.* into #Copy2 from #t2;

commit;
Только вот блокировки все равно не одномоментно накладываются...
5 сен 13, 09:47    [14797448]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
invm
Только вот блокировки все равно не одномоментно накладываются...

Да, уж лучше SNAPSHOT и пусть весь мир подождёт (R)
5 сен 13, 14:20    [14799877]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
defragmentator
Да, уж лучше SNAPSHOT и пусть весь мир подождёт (R)

В смысле? Чего будет ждать "весь мир"?
5 сен 13, 14:40    [14800082]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Crimean
Member

Откуда:
Сообщений: 13147
Гость333
Чего будет ждать "весь мир"?


пока уважаемый оппонент БОЛ почитает
5 сен 13, 16:49    [14800952]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

Откуда:
Сообщений: 20504
Гость333
defragmentator
Да, уж лучше SNAPSHOT и пусть весь мир подождёт (R)

В смысле? Чего будет ждать "весь мир"?


Данная транзакция замедлит выполнение других процессов?
Также интересно, подскажите, как сервер определяет, копии каких таблиц ему надо для меня сделать?
Просматривает всю транзакцию, прежде начать её выполнять?
6 сен 13, 11:34    [14803395]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
Understanding Row Versioning-Based Isolation Levels
6 сен 13, 11:47    [14803475]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
defragmentator
Member

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

до конца пока не осилил, но догадываюсь, что любые изменения в БД, сделанные с начала такой транзакции,
пишутся в отдельную копию БД.
То есть по затратам ресурсов просто впечатляет.
6 сен 13, 17:01    [14805854]     Ответить | Цитировать Сообщить модератору
 Re: Получить снимок двух таблиц  [new]
Гость333
Member

Откуда:
Сообщений: 3683
defragmentator
до конца пока не осилил, но догадываюсь

Что ж, осиливайте до конца.
6 сен 13, 17:03    [14805872]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить