2017-01-25 12 views
1

У нас только стандартная версия SQL Servre, поэтому я не могу использовать функцию моментального снимка. Прежде чем тратить время, просто захотите узнать, возможно ли следующее (или если есть лучший способ):У нас только стандартная версия SQL Server, поэтому нет доступа к функциям моментальных снимков. Опции?

В конце каждого месяца мне нужно сделать снимок месяца и сохранить его в таблице b. В следующем месяце сделайте еще один снимок и добавьте данные моментальных снимков в таблицу b. И так далее ....

Возможно ли создать хранимую процедуру, которая будет запускаться в конце каждого месяца, которая хранит данные моментальных снимков в временную таблицу A. Затем, используя другую хранимую процедуру, возьмите данные из таблицы темп A и добавить в таблицу B? Вторая процедура может иметь таблицу падения A.

Cheers.

+0

Да. Используя 'INSERT INTO/SELECT', вы можете сделать это легко. Вам не нужна временная таблица посередине, хотя вы можете вставить ее прямо в –

ответ

1

Да, это возможно.

Если я вас понимаю, более или менее, это то, что вы хотите:

  • Замок стол
  • Выбрать все в промежуточную таблицу
  • Move все из этой промежуточной таблицы в пункт назначения

Вы можете заблокировать всю таблицу (это предотвратит изменения, но может привести к взаимоблокировкам).

INSERT INTO stagingTable (
    ... -- field list 
) 
SELECT 
    ... -- field list 
FROM 
    myTable WITH (TABLOCK) 
; 

TABLOCK разместит общую блокировку на столе, который будет выпущен, когда выполняется оператор (READ COMMITTED уровень изоляции) или после завершения транзакции/откат (SERIALIZABLE).

Если вы хотите сохранить блокировку в течение всей транзакции, вы можете также добавить подсказку HOLDLOCK, которая переключает уровень изоляции на сериализуемый объект, таким образом блокировка будет освобождена после COMMIT. Не забудьте запустить транзакцию и зафиксировать/отменить ее.

Вы также можете использовать TABLOCKX, который является исключительной блокировкой, препятствующей всем процессам получить блокировку на столе или на чем-либо на нижних уровнях (страницах, строках и т. Д.) В таблице. Это также предотвратит одновременное чтение!

Вы можете позволить SQL Server решить, какую блокировку он хочет использовать (или опустить подсказку), в этом случае SQL Server может использовать более гранулированные блокировки (например, блокировки страниц или строк) вместо блокировки всего Таблица.

+0

. Вся эта блокировка не нужна. Столбец также не нужен. Что вы здесь защищаете? –

+0

Согласен, промежуточная таблица не нужна, если вы не хотите делать дальнейшие преобразования. Указание блокировки может быть опущено, если OP не хочет сохранять блокировку во время всей транзакции или размещать исключительную блокировку в таблице. Случай использования: скопируйте записи, затем выполните обновления в исходной таблице и запретите другим процессам делать что-либо между выбором и обновлением. – Pred

+0

Таким образом, цель блокировки состоит в том, чтобы изолировать кучу записей, чтобы они могли быть помечены обратно в таблицу. Лично я предпочитаю дополнительное поле партии, где шаблон: 1. Обновите поле партии в исходной таблице с заданным статусом; 2.выберите только записи, имеющие этот статус; 3. обрабатывать записи; 4. Обновите исходную таблицу и перейдите к следующему состоянию. –

 Смежные вопросы

  • Нет связанных вопросов^_^