MSSQL CLRP操作和CLR安全错误(SQL Server 2017)

问题描述 投票:0回答:1

我正在使用SQL Server 2017来设置我们正在使用的程序之一。整个事情在MSSQL 2008 r2上都可以正常运行,但在2017年不起作用。

我们的服务器信息:

enter image description here

我们拥有的软件拥有自己的一组SQL查询,我们无法更改它们,我们只输入服务器信息,它就可以连接并设置数据库。

执行此操作时会出现以下错误:

 10342 Assembly 'CLRProcedures' cannot be loaded because this edition of SQL Server only supports SAFE assemblies.

SQL查询为:

--Assembly clrprocedures, version=2019.2.0.0, culture=neutral, publickeytoken=2e56e3245276317a, processorarchitecture=msil
CREATE ASSEMBLY [CLRProcedures]
AUTHORIZATION [dbo]
FROM 0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a24000000000[BUNCH OF NUMBERS HERE...]

WITH PERMISSION_SET=UNSAFE

Log:
--script on: Data Source=167.71.149.66;Integrated Security=False;Persist Security Info=False;User ID=SA;
GO
DROP DATABASE [Slabsmith3]
GO
--script on: Data Source=167.71.149.66;Integrated Security=False;Persist Security Info=False;User ID=SA;
GO
CREATE DATABASE [Slabsmith3]
GO
ALTER DATABASE [Slabsmith3] SET TRUSTWORTHY ON
GO
SP_CONFIGURE 'clr enabled', 1
GO
RECONFIGURE
GO
USE [Slabsmith3]
GO
--script on: Data Source=167.71.149.66;Initial Catalog=Slabsmith3;Integrated Security=False;Persist Security Info=False;User ID=SA;
GO
SET NUMERIC_ROUNDABORT OFF
GO
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON
GO
SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL Serializable
GO
CREATE USER [BackgroundTaskAcknowledger] WITHOUT LOGIN
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE USER [ExtendedPropertyGetter] WITHOUT LOGIN
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE USER [ExtendedPropertySetter] WITHOUT LOGIN
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE USER [RoleProbe] WITHOUT LOGIN
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role InventoryLock'
GO
CREATE ROLE [InventoryLock]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSBasicUser'
GO
CREATE ROLE [SSBasicUser]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSInventoryManager'
GO
CREATE ROLE [SSInventoryManager]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSJobCreator'
GO
CREATE ROLE [SSJobCreator]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSJobViewer'
GO
CREATE ROLE [SSJobViewer]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSPowerUser'
GO
CREATE ROLE [SSPowerUser]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSSlabCreator'
GO
CREATE ROLE [SSSlabCreator]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSSlabDeleter'
GO
CREATE ROLE [SSSlabDeleter]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating role SSSlabViewer'
GO
CREATE ROLE [SSSlabViewer]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering members of role SSJobCreator'
GO
EXEC sp_addrolemember N'SSJobCreator', N'SSPowerUser'
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Altering members of role SSSlabCreator'
GO
EXEC sp_addrolemember N'SSSlabCreator', N'SSPowerUser'
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
BEGIN TRANSACTION
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating schemas'
GO
CREATE SCHEMA [API]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Actions]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Attachments]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Audit]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Importer]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Inventory]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [NWD]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [SSAdmin]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [SSSlabBrowser]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
CREATE SCHEMA [Utilities]
AUTHORIZATION [dbo]
GO
IF @@ERROR <> 0 SET NOEXEC ON
GO
PRINT N'Creating CLR assemblies'
GO
--Assembly clrprocedures, version=2019.2.0.0, culture=neutral, publickeytoken=2e56e3245276317a, processorarchitecture=msil
CREATE ASSEMBLY [CLRProcedures]
AUTHORIZATION [dbo]
FROM 0x4d5a90000300000004000000ffff0000b800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000e1fba0e00b409cd21b8014ccd21546869732070726f6772616d2063616e6e6f742062652072756e20696e20444f53206d6f64652e0d0d0a240000[BUNCH OF NUMBERS CONTINUING HERE..]

WITH PERMISSION_SET=UNSAFE
GO

我使用下面的sql查询来禁用CLR安全性,但是没有用。

EXEC sp_configure 'show advanced options', 1
RECONFIGURE;
EXEC sp_configure 'clr strict security', 0;
RECONFIGURE;
sql-server sql-server-2008 sql-server-2008-r2
1个回答
0
投票

Microsoft更改了从SQL Server 2017开始的游戏。

您应该使用SDK util SN.EXE创建SNK文件。然后执行以下T-SQL脚本。该脚本创建一个非对称密钥和相应的登录名。

--Only for SQL SERVER 2017+
IF SERVERPROPERTY('productversion') >= '14'
   AND SUBSTRING(CAST(SERVERPROPERTY('productversion') AS NVARCHAR(10)), 1, 1) != '9'
    BEGIN
        DECLARE @path NVARCHAR(260);
        DECLARE @password NVARCHAR(128);
        DECLARE @tsqlToEval AS NVARCHAR(MAX);
        SET @path = N'C:\TMP\akCLRProcedures.snk';
        SET @password = N'Se1Tal0k';
        SET @tsqlToEval = N'USE MASTER;' + CHAR(13) + 'CREATE ASYMMETRIC KEY [akCLRProcedures]' + CHAR(13) + 'FROM FILE = ''' + @path + '''
                    ENCRYPTION BY PASSWORD = ''' + @password + '''';

        --PRINT @tsqlToEval

        IF
        (
            SELECT COUNT(*)
            FROM master.sys.asymmetric_keys
            WHERE name LIKE 'akCLRProcedures%'
        ) = 0
            BEGIN
                EXEC sp_executesql 
                     @tsqlToEval;
        END;
        IF NOT EXISTS
        (
            SELECT loginname
            FROM master.dbo.syslogins
            WHERE name = 'loginakCLRProcedures'
        )
            BEGIN
                DECLARE @sqlStatement AS NVARCHAR(1000);
                SELECT @SqlStatement = 'CREATE LOGIN [loginakCLRProcedures] FROM ASYMMETRIC KEY akCLRProcedures';
                EXEC sp_executesql 
                     @SqlStatement;
                EXEC sp_executesql 
                     N'USE MASTER;
                      GRANT UNSAFE ASSEMBLY TO [loginakCLRProcedures];';
        END;
END;
© www.soinside.com 2019 - 2024. All rights reserved.