SSAS - 如何仅使用 SSAS 服务器的 IP 地址从 SQL Server 更改服务器属性

问题描述

我有以下脚本,它在更改安装在同一服务器上的 SSAS 实例上的服务器属性时非常方便:

CREATE PROCEDURE [dbo].[Utility_SetMinIdleSessionTimeout] @TimeoutInSeconds INT,@ServiceAccountUsername NVARCHAR(MAX),@ServiceAccountPassword NVARCHAR(MAX),@DataSource VARCHAR(50) = '127.0.0.1'
    WITH EXECUTE AS 'ABC_Admin'
AS
BEGIN
    SET NOCOUNT ON;

    --==================================================
    --Create Linked Server
    --==================================================
    IF (
            NOT EXISTS (
                SELECT 1
                FROM sys.servers
                WHERE [Name] = 'ServerSettings'
                )
            )
    BEGIN
        EXEC master.dbo.sp_addlinkedserver @server = 'ServerSettings',@srvproduct = '',@provider = 'MSOLAP',@datasrc = @DataSource

        EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = 'ServerSettings',@useself = N'False',@locallogin = NULL,@rmtuser = @ServiceAccountUsername,@rmtpassword = @ServiceAccountPassword

        EXEC master.dbo.sp_serveroption @server = 'ServerSettings',@optname = N'rpc out',@optvalue = N'true'
    END

    --==================================================
    --Create and Execute XMLA
    --==================================================
    DECLARE @XMLA XML,@XMLAString NVARCHAR(MAX) = 
        '<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine" Transaction="true">
            <Alter AllowCreate="true" ObjectExpansion="ObjectProperties" xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
                <Object />
                <ObjectDeFinition>
                <Server xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100" xmlns:ddl200="http://schemas.microsoft.com/analysisservices/2010/engine/200" xmlns:ddl200_200="http://schemas.microsoft.com/analysisservices/2010/engine/200/200" xmlns:ddl300="http://schemas.microsoft.com/analysisservices/2011/engine/300" xmlns:ddl300_300="http://schemas.microsoft.com/analysisservices/2011/engine/300/300" xmlns:ddl400="http://schemas.microsoft.com/analysisservices/2012/engine/400" xmlns:ddl400_400="http://schemas.microsoft.com/analysisservices/2012/engine/400/400" xmlns:ddl500="http://schemas.microsoft.com/analysisservices/2013/engine/500" xmlns:ddl500_500="http://schemas.microsoft.com/analysisservices/2013/engine/500/500">
                    <ID>' + CAST(SERVERPROPERTY('MachineName') AS VARCHAR(MAX)) + '</ID>                
                    <Name>' + CAST(SERVERPROPERTY('MachineName') AS VARCHAR(MAX)) + '</Name>
                    <ServerProperties>
                    <ServerProperty>
                        <Name>MinIdleSessionTimeout</Name>
                        <Value>' + CAST(@TimeoutInSeconds AS NVARCHAR) + '</Value>
                    </ServerProperty>
                    </ServerProperties>
                </Server>
                </ObjectDeFinition>
            </Alter>
        </Batch>'

    SET @XMLA = @XMLAString

    EXEC (@XMLAString) AT [ServerSettings]

    --==================================================
    --Clean up 
    --==================================================
    EXEC master.dbo.sp_dropserver @server = N'ServerSettings',@droplogins = 'droplogins'
END

现在我在另一台服务器上有 SSAS,我想从我的第一台服务器上的 sql Server 在该服务器上运行它。这提供了一个挑战,我有新服务器的 IP 地址,但没有服务器名称,为了让这个脚本工作,我需要同时拥有这两个(数据源是新 IP,服务器名称是新的“MachineName”) XML)。

Other posts claim they're 不是在 sql Server 中本地执行此操作的方法。我注意到的一件事是,当我将每个属性(数据源和机器名称)设置为新服务器的 IP 地址时,proc 失败,但错误消息包含我的新 SSAS 服务器的服务器名称,因此 sql Server必须以某种方式意识到这一点:

返回链接服务器“ServerSettings”的 OLE DB 提供程序“MSOLAP” 消息“元数据管理器中的错误。对象 ID 不能为 已从 'ServerNameABC' 更改为 'NewIPAddress' 'ServerNameABC' 服务器。 ALTER 不能更改对象 ID 声明。”.

这里有什么我遗漏的地方吗,有没有一种简单的方法可以让我实现我在这里寻找的东西?

解决方法

(1) 您的脚本创建了一个 linked server

(2) 然后在链接服务器上执行一个XMLA

SERVERPROPERTY('MachineName') 是一个 sql 语句,它检索服务器的机器名称,因此,在您的情况下,当前服务器名称被检索并替换为字符串。

您可以打印 @XMLAString 变量以交叉检查确切的 XMLA。

现在,当 XMLA 通过 EXEC ... AT ... 语法运行时,它会在远程服务器上运行。这似乎是您收到服务器名称错误的原因。

总之,您可以尝试以下操作:

  • 删除 ID 标签
  • 将新的服务器 IP 地址用于 Name 标记(而不是 CAST(SERVERPROPERTY('MachineName') AS VARCHAR(MAX))

ALTER XMLA 的官方文档不是很清楚!