Azure sql database 在ManagementStudio for Azure SQL数据库上设置隐式事务
在SQLServerManagementStudio中,我选中选项Tools/Options/QueryExecution/SQLServer/ANSI/SETIMPLICIT TRANSACTIONS 这适用于SQL Server数据库,但如果我连接到Azure SQL数据库,它似乎不起作用 对于Azure SQL数据库,如何在默认情况下将隐式_事务设置为ON 编辑 我试过这个: 从对象资源管理器中,我选择数据库,右键单击,新建查询并执行以下脚本:Azure sql database 在ManagementStudio for Azure SQL数据库上设置隐式事务,azure-sql-database,ssms,Azure Sql Database,Ssms,在SQLServerManagementStudio中,我选中选项Tools/Options/QueryExecution/SQLServer/ANSI/SETIMPLICIT TRANSACTIONS 这适用于SQL Server数据库,但如果我连接到Azure SQL数据库,它似乎不起作用 对于Azure SQL数据库,如何在默认情况下将隐式_事务设置为ON 编辑 我试过这个: 从对象资源管理器中,我选择数据库,右键单击,新建查询并执行以下脚本: CREATE TABLE T1 (a INT
CREATE TABLE T1 (a INT)
ROLLBACK
SELECT * FROM T1
结果与预期的一样:无效的对象名称“T1”
现在我点击“更改连接”按钮
我重新连接到同一Azure SQL Server实例
我从数据库组合列表中选择相同的数据库并执行相同的脚本
现在错误是“回滚事务请求没有相应的开始事务。”我无法重现该问题。首先,我使用以下脚本测试了SQL Server和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 Server和Azure SQL数据库(DTU模型)上都是相同的
然后,我在SSMS上将隐式事务配置为默认,对SET implicit_transactions语句进行注释,在测试B、C和D上,我收到了相同的结果
我用SSMS 17.8.1测试了这个。您正在使用哪个版本的SSMS?请从下载最新版本。我刚刚阅读了文档: 我的SQL server版本是12.0,我在SSMS 17.9和18.1中进行了测试,在
Mydatabase
中运行SQL:
更新:
设置隐式\u事务:
但从文件中可以看出:
- 由于ANSI默认设置,隐式事务可能意外打开。 有关详细信息,请参阅 上的隐式\u事务不受欢迎。在大多数情况下 隐式_事务是开启的,这是因为选择了SET ANSI_默认设置为ON
希望这对您有所帮助SQL Server Management Studio有一个默认设置隐式事务的选项(Tools/Options/Query Execution/SQL Server/ANSI/SET IMPLICIT TRANSACTIONS),因此当您打开一个新的查询编辑器时,它会自动设置,您无需在其上写入SET IMPLICIT_事务。此选项不适用于Azure数据库。@skysurfer谢谢。我再次测试并更新了我的答案,它仍然有效。@skysurfer,非常奇怪!我尝试断开/重新连接SQL数据库,甚至尝试重新启动SSMS,运行相同的查询,结果总是
无效的对象名称“T1”。
。我将SSMS更新为最新版本。查看我在原始postCould中的编辑。请运行我提供的测试B、C、D,但在运行这些测试之前,请对在这3个测试中找到的所有SET IMPLICIT_事务进行注释。你应该有和我相同的结果。如果我在解决方案资源管理器中右键单击数据库,选择“新建查询”,然后我运行你的测试,我会得到与你相同的结果。在此之后,我单击“更改连接”图标,使用相同的sql server实例,从列表中选择相同的数据库并再次运行脚本,我得到“提交事务请求没有相应的开始事务”。在B.03、C.04之后,D.04I您收到的结果与我的结果相同,这意味着Azure SQL数据库的行为与SQL Server(在我的计算机SQL 2019中)没有差异。关于Azure SQL,您的假设不正确。如果您可以创建一个脚本来证明SQLAzure在SSMS中使用SET IMPLICIT_事务时的行为不同于SQL,请与我们共享,同时我提供的脚本也证明了这一点。
-------- [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
SET IMPLICIT_TRANSACTIONS { ON | OFF }