Являются ли команды изменения схемы транзакционными? - PullRequest
1 голос
/ 25 января 2010

Например, если я отбрасываю таблицу, а затем откатываю транзакцию, таблица воссоздается?

Каковы ограничения на изменения схемы, которые могут быть сделаны в транзакции?

Если вышеперечисленное зависит от версии Sql Server, скажите, пожалуйста ...

Фон
Я подумываю об использовании некоторых операторов «select into» для создания таблиц, а затем мне нужно отбросить ВСЕ вышеупомянутые таблицы как более позднюю часть рабочего процесса.

Ни в одной таблице не будет более нескольких десятков строк.

Ответы [ 3 ]

6 голосов
/ 25 января 2010

Большинство операторов DDL объекта базы данных могут быть частью пользовательской транзакции. Существуют некоторые исключения, например, операции, связанные с файлами самой базы данных (например, ALTER DATABASE ... ADD / REMOVE FILE). На уровне сервера снова большинство объектов могут быть частью транзакции. Исключением являются такие объекты, как конечные точки, которые могут запускать или останавливать сокет прослушивания.

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

Подавляющее большинство операторов DDL являются только метаданными, все, что они делают, это изменяют некоторые таблицы каталога метаданных (например, они добавляют строку в sys.tables) и, таким образом, они ведут себя так же, как любая другая транзакционная операция: если транзакция выполняется откат строки удаляется, следовательно, таблица «исчезает». Здесь есть больше деталей (например, sys.tables - это представление поверх реальных внутренних таблиц, таких как sys.objects $, и это реальная таблица, изменяемая CREATE TABLE), но на высоком уровне это то, что происходит.

3 голосов
/ 25 января 2010

Почему бы просто не проверить свой сценарий самостоятельно?

Я только что попробовал это - заняло 2 минуты.

USE [MY_DB]
GO
/****** Object:  Table [dbo].[TestTable]    Script Date: 01/25/2010 12:01:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[TestTable](
    [testfield] [varchar](50) NULL
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

BEGIN TRAN

DROP TABLE TestTable 

ROLLBACK
0 голосов
/ 11 сентября 2014

Поток некро, кажется, это больше не так при использовании пакетной обработки, просто запустите приведенный ниже код, в MS SQL Server 2008 r2 следующее НЕ ОБРАЩАЕТСЯ НАЗАД:

begin tran
go
create table AATableThatDoesNotExist
(
blah int null
)
go
create table AATableThatDoesNotExist
(
blah int null
)
go
create table AATableThatShouldNotExist
(
blah int null
)
rollback tran
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...