安装 CLR for SQL Server Linux 版本



我有一个C#文件,可以在Windows上完美地编译和安装。我可以使用以下命令在带有 mcs 的 Linux 上编译它而不会出错:

mcs -reference:System.Data.dll -target:library -out:tests/RegEx.dll tests/regex.cs

我已经验证了该文件是否存在,并且在与源相同的目录中具有权限 775。接下来,我尝试使用以下方法将其安装在服务器上:

/opt/mssql-tools/bin/sqlcmd -P Password12! -S localhost -U SA -Q "CREATE ASSEMBLY Regex from '$TRAVIS_BUILD_DIR/tests/RegEx.dll' WITH PERMISSION_SET = SAFE"

但是,我收到错误:

创建程序集失败,因为它无法打开物理文件'/home/travis/build/Beakerboy/sqlsrv/tests/RegEx.dll':2(系统找不到指定的文件。

我担心路径可能需要是"Windows格式",并发现甚至可能需要"C:\"的建议。我接下来尝试了这个,但仍然找不到该文件:

/opt/mssql-tools/bin/sqlcmd -P Password12! -S localhost -U SA -Q "CREATE ASSEMBLY Regex from 'c:hometravisbuildBeakerboysqlsrvtestsRegEx.dll' WITH PERMISSION_SET = SAFE"

有人对如何格式化有建议吗?我的服务器安装的完整 travis 脚本在 GitHub 上

据我所知,除非在过去一年或一年中发生了一些变化,否则我相信您只能使用十六进制字节/VARBINARY选项创建程序集,而不是从文件系统创建程序集。到目前为止,我无法找到这方面的文档,但我确实记得在 SQL Server for Linux 发布时阅读了它(限制不是从文件系统加载,只有SAFE程序集等(。 (O.P.能够从DLL加载它,所以要么有些东西发生了变化,要么我记错了(。

如果在 Windows 上编译,我创建了一个命令行实用程序,用于将 DLL 转换为正确的格式: 二进制格式化程序 .我一直想更新该项目,以便它在本地 Linux 上运行,但还没有解决这个问题(如果有人有时间😸,可能会在那里使用一些帮助(。

无论如何,如果你想要正则表达式函数(以及更多(,你可以通过下载和安装我创建的SQL#库来更轻松地做到这一点,因为它确实可以在Linux上的SQL Server上运行。它具有 .NET 中可用的大多数(如果不是全部(正则表达式方法,以及一些额外的方法。而且,它正确处理安全性,因为所有程序集都已签名,因此不需要启用TRUSTWORTHY(一种不好的做法(或禁用'clr strict security'

@David Browne 有正确的建议,尝试不同的文件路径。

这是我的 Dockerfile:

FROM mcr.microsoft.com/mssql/server:2019-CU10-ubuntu-20.04
RUN set -eux; 
curl -fSL "wget https://github.com/Beakerboy/drupal-sqlsrv-regex/releases/download/1.0/RegEx.dll"; 
mv RegEx.dll /var/opt/mssql/data/; 

CLR 加载了:

sqlcmd -P Password12! -S localhost -U SA -d mydrupalsite -Q "EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'clr strict security', 0; RECONFIGURE; EXEC sp_configure 'clr enable', 1; RECONFIGURE"
sqlcmd -P Password12! -S localhost -U SA -d mydrupalsite -Q "CREATE ASSEMBLY Regex from '/var/opt/mssql/data/RegEx.dll' WITH PERMISSION_SET = SAFE"
sqlcmd -P Password12! -S localhost -U SA -d mydrupalsite -Q "CREATE FUNCTION dbo.REGEXP(@pattern NVARCHAR(100), @matchString NVARCHAR(100)) RETURNS bit EXTERNAL NAME Regex.RegExCompiled.RegExCompiledMatch"

最新更新