这已经困扰我2天了。我有一个需要EXTERNAL_ACCESS 的CLR sp。我可以通过将 TRUSTWORTHY ON 设置为通过 VS2010 在我的开发盒上部署它,但我们不想对生产服务器这样做。我们购买了与 AuthentiCode 兼容的证书,我尝试用它签署我的程序集,但由于链接而失败,所以我按照此处详述的说明从证书中删除链接。
接下来,我尝试在 VS 中对程序集进行签名,但收到错误“尝试引用不存在的令牌”。
因此,正如几位博主推荐的那样,转到命令行并使用 SignTool.exe 使用去链证书对程序集进行签名。该实用程序报告签名成功。
现在将程序集导入我的开发盒上的 SQL Server(express 2008R2)。首先将 TRUSTWORTHY 设置为关闭,因为此过程必须应用于生产服务器。然后我跑
CREATE ASSEMBLY SqlClrProcedures from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
这会出现以下错误:*为程序集“SqlClrProcedures”创建程序集失败,因为程序集“SqlClrProcedures”未获得 PERMISSION_SET = EXTERNAL_ACCESS 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 EXTERNAL ACCESS ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或程序集使用证书或非对称密钥签名,该证书或非对称密钥具有相应的登录名并具有外部访问程序集权限。*
我以 sa 身份登录。好的,所以我创建了一个用户,将数据库的所有权分配给他并授予他外部访问权限:
GRANT EXTERNAL ACCESS Assembly to ClrLogin
然后尝试
CREATE ASSEMBLY SqlClrProcedures AUTHORIZATION ClrLogin from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
这会产生与上述相同的错误。
dbo 已被授予 EXTERNAL ACCESS ASSEMBLY 并且程序集已签名,但我不了解有关相应登录的部分,我需要登录证书吗?
如果设置 TRUSTWORTHY ON 只是为了通过 CREATE ASSEMBLY 程序集导入正常但是当我运行 sp 时出现此错误:
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65573. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly 'sqlclrprocedures, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An error relating to security occurred. (Exception from HRESULT: 0x8013150A)
System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
所以看来证书没有得到认可。有人可以告诉我我做错了什么吗?