我正在使用SQL Server 2017来设置我们正在使用的程序之一。整个事情在MSSQL 2008 r2上都可以正常运行,但在2017年不起作用。
我们的服务器信息:
我们拥有的软件拥有自己的一组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;
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;