仅当 AlwaysOn 数据库为主时才执行 T-SQL

Dat*_*n80 5 sql-server sql-server-2012 availability-groups ssis-2012

关于系统的小背景。它是具有 1 个主要和 1 个辅助的 SQL Server 2012 AlwaysOn 可用性组。

我一直在关注这篇文章(SSIS with AlwaysOn)以使 SSIS 与 AlwaysOn 一起工作。我有一个记录服务器当前角色的表和一个每两分钟运行一次检查它最近是否发生故障的作业。我遇到的问题是次要只接受 SSISDB 的只读连接,因此我的脚本不会执行。

这是脚本:

USE master;

DECLARE @last_role TINYINT;
SET @last_role = (
   SELECT TOP 1 [replica_role]
   FROM [dbo].[replica_role]
);

DECLARE @current_role TINYINT;
SET @current_role = (
   SELECT ROLE 
   FROM sys.dm_hadr_availability_replica_states 
   WHERE is_local = 1
);

IF (@last_role = 2 AND @current_role = 1)
BEGIN
    USE SSISDB;
    OPEN MASTER KEY DECRYPTION BY PASSWORD = 'x'
    ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
END

USE master;
UPDATE dbo.[replica_role] SET [replica_role] = @current_role;
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么会发生错误,因为该IF语句的计算结果为 false,因此 USE SSISDB 没有被执行。我可以将语句转换为字符串并使用 exec 但如果可能的话我宁愿不这样做。当我执行脚本时,这是我得到的错误:

USE master;

DECLARE @last_role TINYINT;
SET @last_role = (
   SELECT TOP 1 [replica_role]
   FROM [dbo].[replica_role]
);

DECLARE @current_role TINYINT;
SET @current_role = (
   SELECT ROLE 
   FROM sys.dm_hadr_availability_replica_states 
   WHERE is_local = 1
);

IF (@last_role = 2 AND @current_role = 1)
BEGIN
    USE SSISDB;
    OPEN MASTER KEY DECRYPTION BY PASSWORD = 'x'
    ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
END

USE master;
UPDATE dbo.[replica_role] SET [replica_role] = @current_role;
Run Code Online (Sandbox Code Playgroud)

Bre*_*zar 4

辅助副本的客户端连接角色决定您的数据库是始终可用、仅可用于只读连接还是根本不可用。如果将数据库设置为只读连接,则连接字符串必须包含该联机丛书页面中定义的参数 ApplicationIntent=ReadOnly。

当您尝试连接到该数据库而不指定 ApplicationIntent=ReadOnly 时,您的查询将失败。