【发布时间】:2015-02-17 07:52:25
【问题描述】:
我正在 C# 中创建用户定义的函数,如链接中所述:https://msdn.microsoft.com/en-us/library/w2kae45k%28v=vs.90%29.aspx
(我使用C# CLR项目,我有VS 2010,SQL server 2012。VS 2010中的代码在framework 3.5中,sql server在framework 4.0中)
我没有成功部署,即使我选择了正确的服务器+数据库,所以我像这样手动复制了dll:
- 新建sql项目作为链接(我选择Visual C# CLR数据库对象,选择服务器+数据库)
-
添加用户自定义函数:
使用系统; 使用 System.Data; 使用 System.Data.SqlClient; 使用 System.Data.SqlTypes; 使用 Microsoft.SqlServer.Server;
公共部分类 UserDefinedFunctions { [Microsoft.SqlServer.Server.SqlFunction()] 公共静态 int testfunc() { // 把你的代码放在这里 返回 1234; } };
把dll放到sql server的程序集中(在sql ssms:databases->“数据库名”->可编程性->程序集->新建程序集->...选择权限集“安全的dll” ")。
像这样添加一个新函数: 创建函数 testfunc() 返回整数 作为 外部名称 SqlServerProject1.UserDefinedFunctions.testfunc
(SqlServerProject1是命名空间和dll名,UserDefinedFunctions是类名,testfunc是C#和sql server中的函数名)
-
在执行 select dbo.funcname() 时一切正常,但现在在将 C# (testfunc) 中的代码更改为此代码时出现问题(请参阅下面的异常):
[Microsoft.SqlServer.Server.SqlFunction()] 公共静态 int testfunc() { WebClient webC = new WebClient(); WebRequest 请求 = HttpWebRequest.Create("http://axdev:8090"); 返回 12345; }
- 运行select dbo.testfunc()时出现异常,我得到:
消息 6522,第 16 级,状态 2,第 1 行 执行用户定义的例程或聚合“testfunc”期间发生 .NET Framework 错误: System.Security.SecurityException:请求“System.Security.Permissions.SecurityPermission,mscorlib,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089”类型的权限失败。 System.Security.SecurityException: 在 System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 create) 在 System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission 上限、StackCrawlMark 和 stackMark) 在 System.Security.CodeAccessPermission.Assert() 在 UserDefinedFunctions.testfunc()
- 我无法使用权限集 =“无限制”创建程序集(与第 3 步相同,但使用“无限制”,因为我收到错误消息:
> 标题:Microsoft SQL Server Management Studio
SqlAssembly 'SqlServerProject1' 的创建失败。 (Microsoft.SqlServer.Smo)
其他信息:
执行 Transact-SQL 语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)
为程序集“SqlServerProject1”创建程序集失败,因为程序集“SqlServerProject1”未获得 PERMISSION_SET = UNSAFE 的授权。当以下任一情况为真时,程序集被授权:数据库所有者 (DBO) 具有 UNSAFE ASSEMBLY 权限并且数据库具有 TRUSTWORTHY 数据库属性;或者程序集使用证书或非对称密钥签名,该证书或非对称密钥具有相应的登录名并具有 UNSAFE ASSEMBLY 权限。 (Microsoft SQL Server,错误:10327)
按钮:
好的
- 如何解决上述问题才能正常运行新的testfunc代码?
========
一个新问题 - 在运行 alter database 'mydb' set trustworthy on 后,再次添加“permission set” = unrestricted 的程序集时出现新错误。
标题:Microsoft SQL Server Management Studio
SqlAssembly 'SqlServerProject1' 的创建失败。 (Microsoft.SqlServer.Smo)
------------------ 附加信息:
执行 Transact-SQL 语句时发生异常或 批。 (Microsoft.SqlServer.ConnectionInfo)
master 数据库中记录的数据库所有者 SID 与 数据库“mydb”中记录的数据库所有者 SID。你应该纠正 这种情况通过使用重置数据库“mydb”的所有者 ALTER AUTHORIZATION 语句。 (Microsoft SQL Server,错误:33009)
谢谢:)
【问题讨论】:
-
错误消息告诉您解决问题的两种方法。您是否尝试过其中任何一个?
-
对于第二个异常(第 7 步),我运行“alter database mydbname set trustworthy on”,得到一个新错误(我把它放在我的帖子中)。
标签: c# .net sql-server visual-studio-2010