В SQL Server 2008 возможно ли отключить автоматическое удаление глобальной временной таблицы - PullRequest
0 голосов
/ 13 мая 2010

Вопрос 1: Я использую глобальные временные таблицы в SQL Server 2008. Но как только мое соединение закрыто, эта временная ошибка сбрасывается. Есть ли способ отключить автоматическое удаление

Вопрос 2. Если два соединения обращаются к одной и той же глобальной временной таблице, а другое соединение пытаясь удалить эту глобальную временную таблицу, SQL Server правильно обрабатывает эту синхронизацию?

Ответы [ 3 ]

2 голосов
/ 13 мая 2010

Вы можете создать свои глобальные временные таблицы в хранимой процедуре и пометить ее параметром запуска.

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

пример кода

CREATE PROC dbo.CreateGlobalTempTables
AS
CREATE TABLE ##my_temp_table
(
   fld1 INT NOT NULL PRIMARY KEY,
   fld2 INT NULL
);
GO

EXEC dbo.sp_procoption 'dbo.CreateGlobalTempTables', 'startup', 'true';

Глобальная временная таблица будет автоматически создаваться при запуске и сохраняться до тех пор, пока кто-то явно не удалит ее.

2 голосов
/ 13 мая 2010

Если вам нужна таблица для сохранения после смерти соединения, которое ее создало, вы должны просто создать обычную таблицу вместо временной. Он по-прежнему может быть создан непосредственно в базе данных tempdb (что дает вам преимущества простой регистрации и автоматического уничтожения при перезапуске сервера), но его имя не будет иметь префикс ##.

DROP TABLE - это транзакционный оператор, который будет блокировать, если есть какие-либо активные соединения, использующие эту таблицу (с блокировками).

0 голосов
/ 13 мая 2010

Когда соединение, которое создало ## GlobalTempTable, заканчивается, таблица будет удалена, если на нее не установлена ​​блокировка.

Вы можете запустить что-то подобное из другого процесса, чтобы предотвратить удаление таблицы:

BEGIN TRANSACTION
    SELECT TOP 1 FROM ##GlobalTempTable WITH (UPDLOCK, HOLDLOCK)


...COMMIT/ROLLBACK

Однако, когда транзакция завершится, таблица будет удалена. Если вы не можете использовать транзакцию, подобную этой, вам следует использовать постоянную таблицу, используя метод Таблица с ключами процесса .

...