Включение неявных транзакций в Management Studio для Azure SQL базы данных - PullRequest
0 голосов
/ 09 января 2020

В SQL Server Management Studio. Я отмечаю опцию Инструменты / Параметры / Выполнение запроса / SQL Сервер / ANSI / SET НЕОБХОДИМЫЕ СДЕЛКИ

Это работает для SQL База данных сервера, но, кажется, не работает если я подключусь к Azure SQL База данных

Как можно установить IMPLICIT_TRANSACTIONS в значение ON по умолчанию для Azure SQL База данных?

Редактировать

Я пробовал это :

из обозревателя объектов. Я выбираю базу данных, щелкаю правой кнопкой мыши, создаю новый запрос и выполняю этот скрипт:

CREATE TABLE T1 (a INT)
ROLLBACK
SELECT * FROM T1 

Результат, как и ожидалось: Неверное имя объекта 'T1'

Теперь я нажимаю кнопку «Изменить соединение»

Я воссоединяюсь с тем же Azure SQL Экземпляр сервера

Я выбираю ту же базу данных из комбинированного списка базы данных и выполняю ее script.

Теперь ошибка: «У запроса ROLLBACK TRANSACTION нет соответствующей BEGIN TRANSACTION.»

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я только что следовал документу: SET IMPLICIT_TRANSACTIONS (Transact- SQL) .

SET IMPLICIT_TRANSACTIONS { ON | OFF }

Моя SQL версия сервера 12.0, я тестировал в SSMS 17.9 и 18.1 , запустите SQL в Mydatabase:

enter image description here

Обновление:

Установить IMPLICIT_TRANSACTIONS: enter image description here

Но из документа Установить IMPLICIT_TRANSACTIONS сказано:

  • Неявные транзакции могут неожиданно включиться из-за ANSI по умолчанию. Подробнее см. SET ANSI_DEFAULTS (Transact- SQL) .

    IMPLICIT_TRANSACTIONS ON не пользуется популярностью. В большинстве случаев, когда IMPLICIT_TRANSACTIONS включен, это происходит потому, что был сделан выбор SET ANSI_DEFAULTS ON.

Я открываю новый запрос и SET ANSI_DEFAULTS ON, он все еще работает: enter image description here

Надеюсь, это поможет

0 голосов
/ 09 января 2020

Я не могу воспроизвести проблему. Сначала я проверил, что SQL Сервер и SQL Azure ведут себя одинаково для неявных транзакций с помощью следующего сценария.

-- Transact-SQL.  

go  

-- Preparations.  

SET NOCOUNT ON;  

SET IMPLICIT_TRANSACTIONS OFF;  

go  

WHILE (@@TranCount > 0) COMMIT TRANSACTION;  

go  

IF (OBJECT_ID(N'dbo.t1',N'U') IS NOT NULL) DROP TABLE dbo.t1;  

go  

CREATE table dbo.t1 (a int);  

go  



PRINT N'-------- [Test A] ---- OFF ----';  

PRINT N'[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.';  

PRINT N'[A.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

SET IMPLICIT_TRANSACTIONS OFF;  

go  

INSERT INTO dbo.t1 VALUES (11);  

INSERT INTO dbo.t1 VALUES (12);  

PRINT N'[A.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  



PRINT N' ';  

PRINT N'-------- [Test B] ---- ON ----';  

PRINT N'[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  

PRINT N'[B.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

SET IMPLICIT_TRANSACTIONS ON;  

go  

INSERT INTO dbo.t1 VALUES (21);  

INSERT INTO dbo.t1 VALUES (22);  

PRINT N'[B.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  

COMMIT TRANSACTION;  

PRINT N'[B.04] @@TranCount, after COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  



PRINT N' ';  

PRINT N'-------- [Test C] ---- ON, then BEGIN TRAN ----';  

PRINT N'[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  

PRINT N'[C.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

SET IMPLICIT_TRANSACTIONS ON;  

go  

BEGIN TRANSACTION;  

INSERT INTO dbo.t1 VALUES (31);  

INSERT INTO dbo.t1 VALUES (32);  

PRINT N'[C.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  

COMMIT TRANSACTION;  

PRINT N'[C.04] @@TranCount, after a COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

COMMIT TRANSACTION;  

PRINT N'[C.05] @@TranCount, after another COMMIT, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  



PRINT N' ';  

PRINT N'-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----';  

PRINT N'[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.';  

PRINT N'[D.02] @@TranCount, at start, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

SET IMPLICIT_TRANSACTIONS ON;  

go  

INSERT INTO dbo.t1 VALUES (41);  

BEGIN TRANSACTION;  

INSERT INTO dbo.t1 VALUES (42);  

PRINT N'[D.03] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  

COMMIT TRANSACTION;  

PRINT N'[D.04] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

COMMIT TRANSACTION;  

PRINT N'[D.05] @@TranCount, after INSERTs, == ' + CAST(@@TRANCOUNT AS NVARCHAR(10));  

go  



-- Clean up.  

SET IMPLICIT_TRANSACTIONS OFF;  

go  

WHILE (@@TranCount > 0) COMMIT TRANSACTION;  

go  

DROP TABLE dbo.t1;  

go

Следующие результаты были одинаковыми как для SQL Сервер, так и Azure SQL База данных (модель DTU).

-------- [Test A] ---- OFF ----
[A.01] Now, SET IMPLICIT_TRANSACTIONS OFF.
[A.02] @@TranCount, at start, == 0
[A.03] @@TranCount, after INSERTs, == 0

-------- [Test B] ---- ON ----
[B.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[B.02] @@TranCount, at start, == 0
[B.03] @@TranCount, after INSERTs, == 1
[B.04] @@TranCount, after COMMIT, == 0

-------- [Test C] ---- ON, then BEGIN TRAN ----
[C.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[C.02] @@TranCount, at start, == 0
[C.03] @@TranCount, after INSERTs, == 2
[C.04] @@TranCount, after a COMMIT, == 1
[C.05] @@TranCount, after another COMMIT, == 0

-------- [Test D] ---- ON, INSERT, BEGIN TRAN, INSERT ----
[D.01] Now, SET IMPLICIT_TRANSACTIONS ON.
[D.02] @@TranCount, at start, == 0
[D.03] @@TranCount, after INSERTs, == 2
[D.04] @@TranCount, after INSERTs, == 1
[D.05] @@TranCount, after INSERTs, == 0

Затем я настроил неявные транзакции по умолчанию для SSMS, прокомментировал операторы SET IMPLICIT_TRANSACTIONS, а в тестах B, C и D, я получил те же результаты.

Я проверял это с SSMS 17.8.1. Какую версию SSMS вы используете? Пожалуйста, загрузите последнюю версию с здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...