SQLAWS 上的 CLR 支持 SQL Server 2017 RDS

SQLCLR Support on AWS SQL Server 2017 RDS

我需要在 AWS SQL Server 2017 RDS 中加载程序集。

我在文档中找不到它。这可能吗?如果是,那又如何?

这与“SQL Server CLR stored procedures in AWS?”相似但不是重复,因为我需要在 SQL Server 2017 AWS 中创建程序集并将参数 clr enabled 更改为 1在这个版本中是不可能的,并且在那个问题或答案中没有解决。

虽然这曾经有效(我在 AWS 2016 SP1 CU2 上进行了测试),但似乎现在(从 SQL Server 2017 开始)由于新的“CLR 严格安全性”而被 AWS 阻止" instance-level 配置设置。

根据 Reddit discussion noted in the comment on the answer linked by @Larnu

In RDS SQL Server 2016 and backwards, CLR is supported in SAFE mode and using assembly bits only. Since in SQL Server 2017 the parameter 'CLR strict security' is set to 1 by default and even using CLR SAFE and assembly bits options, you will receive an error because the parameter 'CLR strict security' need to be disabled or need to trust the assembly by using the stored procedure "sp_add_trusted_assembly". But this stored procedure, requires sysadmin permissions, that is not supported in RDS SQL Server as you can see in the Microsoft Documentation: ...

Therefore, RDS does not support UNSAFE assemblies, and all the assemblies are treated like UNSAFE with this new feature, the feature CLR will not be supported in RDS SQL Server 2017. The parameter 'CLR strict security' will be blocked by our automation's and customers will not be able to modify this. CLR uses CAS (code access security) in the .NET Framework and is no longer supported as a security issue. A CLR assembly created with PERMISSION_SET = SAFE may be able to access to external resources, unmanaged code and acquire sysadmin privileges.
...
It is unfortunate that because of the above, CLR feature is NOT SUPPORTED in RDS SQL Server 2017.

You can however, also consider using SQL Server on EC2 which gives you full Administrative privileges just like you would with on-prem installations.

起初我希望有办法让AWS解除这个限制,鉴于AWS的原因是:

  1. the parameter 'CLR strict security' need to be disabled or need to trust the assembly by using the stored procedure "sp_add_trusted_assembly"

    这不完全正确。您也可以使用 Module Signing(无论如何这是更好的方法)

  2. RDS does not support UNSAFE assemblies, and all the assemblies are treated like UNSAFE with this new feature

    该措辞是 Microsoft 的重大失败。程序集在操作意义上 被视为 UNSAFE,仅在 加载要求 中。意思是 ALL 程序集,即使是标记为 SAFEEXTERNAL_ACCESS 的程序集,也必须通过之前仅为 UNSAFE 程序集保留的相同检查。

由于这两个原因本质上都是误解,我认为也许 AWS 可以 re-allow“启用 CLR”并且仅通过模块签名支持 SAFE 程序集。但是,然后我 re-read 来自“AWS Premium Support”的消息并注意到他(“Johnson”)表示不支持 sp_add_trusted_assembly 的原因是它需要 sysadmin 权限,这不支持。模块签名方法需要授予 certificate-based 登录 UNSAFE ASSEMBLY 权限,只有 sysadmin 才能做到这一点。所以即使这样也行不通。看起来你唯一的选择是 运行 带有 SQL 服务器 运行 的 EC2 虚拟机(由 AWS 支持和 建议)。

这种情况和Azure非常相似:Azure SQL数据库根本不支持SQLCLR(虽然之前支持了大约18个月,突然在mid-April结束了, 2016),但您可以 运行 SQL Azure VM 上的服务器以获得完整的 SQLCLR 支持,最近他们引入了 Azure SQL 数据库托管实例,它支持 SQLCLR.

无论如何,从不支持从 DLL 创建,仅支持从 VARBINARY 文字/十六进制字节创建。您可以使用我创建的开源实用程序 BinaryFormatter 将 DLL 转换为 VARBINARY 字符串。另外,请参阅我的系列文章: SQLCLR vs SQL Server 2017

不幸的是在2017+,它不被支持。即使您确实找到了某种方法来侵入设置并使其正常工作,亚马逊在决定破解时也绝不会支持它。基于它可以在 2016 年运行的事实,我们四处奔走试图让它运行,但他们确实使用 SQL Server 2017 中的新安全设置完全禁用了它。我们最终失败的几个原因之一坚持使用托管 SQL 服务器的 EC2 实例,而不是 RDS。

我只是想确认,根据今天早些时候的支持聊天,RDS 中的 Sql2019 仍然不支持 CLR

  1. Aws 不允许将“CLR strict security”设置为 false,因为“安全原因”。 (这是一个错误的决定,因为 proved here by Solomon Rusky。...如果是这样,他们也会为 2017 年之前的版本禁用 CLR。​​)
  2. sp_add_trusted_assembly cannot be used because the "master" RDS user account 不是“sysadmin”的成员,也没有“CONTROL SERVER”权限。
  3. 您不能授予登录“不安全组装”权限(see the "Microsoft SQL Server security" section), which is required for the other, more complicated approach 使 CREATE/ALTER 组装正常工作。