我有一个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
程序集等(。如果在 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"