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

Откуда:
Сообщений: 24
Привет.

Подскажите как можно скопировать часть таблицы в новую?


Думаю надо что-то типа такого:

а)наложить блокировку на таблицу, чтобы ее ни кто не мог изменить.
б) select * новая_таблица from таблица where условие
в) ALTER TABLE таблица TO таблица_старая
г) ALTER TABLE новая_таблица TO таблица
д) снятие блокировки




Подскажите как блокировку сделать и какую?
31 июл 17, 13:58    [20688005]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36968
Куда скопировать? Зачем скопировать? Что за волшебные пункты "в" и "г" ?

Сообщение было отредактировано: 31 июл 17, 14:07
31 июл 17, 14:06    [20688057]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
а и д совершенно не очевидны.
31 июл 17, 14:10    [20688076]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Гавриленко Сергей Алексеевич
Куда скопировать? Зачем скопировать? Что за волшебные пункты "в" и "г" ?


скопировать в ту же БД
31 июл 17, 14:23    [20688140]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
а и д совершенно не очевидны.


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
31 июл 17, 14:23    [20688143]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
Владислав Колосов
а и д совершенно не очевидны.


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?
31 июл 17, 14:28    [20688176]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
пропущено...


да, я пытаюсь понять как их сделать.

Просто надо чтобы на время копирования ни кто не мог изменять данные в таблице.
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
31 июл 17, 15:14    [20688546]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
правильный проходящий.
пропущено...
Вы всегда делаете закат солнца вручную или таки иногда пользуетесь возможностями системы? Для какой задачи вы выбрали такой способ решения?


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
И почему вы решили, что вам обязательно нужна именно ручная блокировка/разблокировка? Вы их вообще видели? Чем не подошли транзакции и уровни их изоляции? Или вы про них не знаете? И потому считаете, что надо действовать как в старых настольных однопользовательских СУБД только руками, только все сами, явно и т.д.? Думаете, создатели серверов баз данных совершенно не в теме многопользовательского доступа к данным?
31 июл 17, 16:00    [20688788]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
ХД,

Вы не хотите, чтобы когда не происходило изменение?
Во время чтения страницы данных изменение не произойдёт. Т. е. запрос будет всегда читать корректные данные за исключением уровня изоляции UNCOMMITTED, если Вы его установите.
31 июл 17, 16:21    [20688900]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
Если вы не хотите, чтобы в таблицу что-то записывали - добавьте триггер, который будет выбрасывать исключение при обновлении или записи.
31 июл 17, 16:34    [20688958]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
пропущено...


Для того чтобы скопировать часть данных таблицы.

А то что осталось дропнуть.

Таблица большая и удаление из нее очень ресурсоемкая операция.
И почему вы решили, что вам обязательно нужна именно ручная блокировка/разблокировка? Вы их вообще видели? Чем не подошли транзакции и уровни их изоляции? Или вы про них не знаете? И потому считаете, что надо действовать как в старых настольных однопользовательских СУБД только руками, только все сами, явно и т.д.? Думаете, создатели серверов баз данных совершенно не в теме многопользовательского доступа к данным?


А вы какой вариант предлагаете?
31 июл 17, 16:47    [20688991]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
Если вы не хотите, чтобы в таблицу что-то записывали - добавьте триггер, который будет выбрасывать исключение при обновлении или записи.


Хм... интересная мысль!
31 июл 17, 16:47    [20688995]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
ХД,

Вы не хотите, чтобы когда не происходило изменение?



чтобы пока копируются данные из таблицы-источника, таблицу-источник ни кто не мог изменить.
31 июл 17, 16:49    [20689004]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
правильный проходящий.
Guest
ХД
А вы какой вариант предлагаете?
Использовать возможности системы, для чего их предварительно хоть немного изучить. 1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит, его таки проектировали не полные идиоты и про необходимость неизменности данных во время работы с ними они таки подумали.
31 июл 17, 17:10    [20689071]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
правильный проходящий.
ХД
А вы какой вариант предлагаете?
Использовать возможности системы, для чего их предварительно хоть немного изучить. 1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит, его таки проектировали не полные идиоты и про необходимость неизменности данных во время работы с ними они таки подумали.


Поподробнее можете написать?
31 июл 17, 17:15    [20689091]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7754
ХД,

подробнее о чем Вы хотите узнать? Типы блокировок описаны в справке и не являются секретным знанием...
31 июл 17, 17:25    [20689130]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
Владислав Колосов
ХД,

подробнее о чем Вы хотите узнать? Типы блокировок описаны в справке и не являются секретным знанием...


Хочу узнать что товарищ пытается сказать.

правильный проходящий.
1(Одна) транзакция с нужным уровнем изоляции полностью решает проблему. Нужные блокировки сам сервер наложит



SERIALIZABLE он имеет ввиду?

Может он что-то недопонял просто?
31 июл 17, 17:39    [20689188]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
982183
Member

Откуда: VL
Сообщений: 3352
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.
1 авг 17, 02:05    [20689919]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
982183
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.

Судя по описанию, ТС понимает,
что скопировать меньшую часть данных
и дропнуть исходную таблицу менее ресурсоемко, чем удалять, а вот ты - нет
1 авг 17, 06:40    [20689946]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
делайте свой перелив данных с tablockx:
begin tran
   select *
   into dbo.T2
   from dbo.T1 with(tablockx)
   where ... 

   drop table dbo.T1;
commit;

эксклюзивно залочите всю таблицу до конца транзакции
1 авг 17, 07:57    [20690010]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
982183
Судя по описанию, тебе не "скопировать" надо, а просто почистить. Т.Е удалить ненужные данные.
1. Скопируй имеющуюся таблицу в резерв, или просто создай резервную копию.
2. Удали ненужные данные.


Я бы с удовольствием.

Но вот удаление 95% данных из таблички, которая весит больше терабайта - занятие малоприятное и чреватое.
1 авг 17, 10:21    [20690416]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o
делайте свой перелив данных с tablockx:
begin tran
   select *
   into dbo.T2
   from dbo.T1 with(tablockx)
   where ... 

   drop table dbo.T1;
commit;

эксклюзивно залочите всю таблицу до конца транзакции




О, отлично, похоже то что нужно, большое спасибо!



TABLOCKX

Указывает, что монопольная блокировка таблицы применяется до конца транзакции.
1 авг 17, 10:24    [20690429]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?
1 авг 17, 10:28    [20690447]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
o-o
Guest
ХД
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?

нет конечно.
никому, кроме вашей сессии, доступна не будет.
а надо?
1 авг 17, 10:30    [20690464]     Ответить | Цитировать Сообщить модератору
 Re: скопировать часть таблицы  [new]
ХД
Member

Откуда:
Сообщений: 24
o-o
ХД
o-o,

а скажите, при
TABLOCKX
таблица будет доступна для SELECT другим пользователям?

нет конечно.
никому, кроме вашей сессии, доступна не будет.
а надо?


Хотелось бы.

ЧТобы они только читаьт могли, а изменить нет.

Читаю про TABLOCK, но как-то мутно написано. Однозначно понять не могу что они имели ввиду.

+
TABLOCK

Указывает, что на таблицу наложена блокировка, которая удерживается до окончания инструкции. При чтении данных накладывается совмещаемая блокировка. При изменении данных накладывается монопольная блокировка. Если при этом указан аргумент HOLDLOCK, совмещаемая блокировка таблицы удерживается до конца транзакции.

При использовании с массовым поставщиком наборов строк OPENROWSET для импорта данных в таблицу без индексов аргумент TABLOCK позволяет нескольким клиентам параллельно загружать данные в целевую таблицу с оптимизацией записи в журнал и блокировки.
1 авг 17, 10:32    [20690471]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить