SSAS - 如何从 SQL 服务器更改 ServerProperty,仅使用 SSAS 服务器的 IP 地址

SSAS - How To Change A ServerProperty From SQL Server With Only the IP Address the SSAS 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 服务器在该服务器上 运行 这个。这提供了一个挑战,我有新服务器的 IP 地址但没有服务器名称,为了让这个脚本工作我需要同时拥有这两个(数据源是新 IP,服务器名称是新的“MachineName”在XML).

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

OLE DB provider "MSOLAP" for linked server "ServerSettings" returned message "Errors in the metadata manager. The object ID cannot be changed from 'ServerNameABC' to 'NewIPAddress' for the 'ServerNameABC' server. The object ID cannot be changed by an ALTER statement.".

这里有什么我遗漏的吗?有没有一种简单的方法可以让我实现这里的目标?

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

(2) 然后在链接服务器

上执行XMLA

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

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

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

因此,总而言之,您可以尝试以下操作:

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

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