[英]Security issues on user defined functions for Sql server 2012
我正在C#中创建用户定义的函数,如链接上所述: https : //msdn.microsoft.com/en-us/library/w2kae45k%28v=vs.90%29.aspx
(我使用C#CLR项目,我有VS 2010,SQL Server2012。VS2010中的代码在Framework 3.5中。SQLServer在Framework 4.0中)
我没有成功部署,即使选择了正确的服务器+数据库,也是如此,我手动复制了dll:
添加用户定义的功能:
使用系统; 使用System.Data; 使用System.Data.SqlClient; 使用System.Data.SqlTypes; 使用Microsoft.SqlServer.Server;
公共局部类UserDefinedFunctions {[Microsoft.SqlServer.Server.SqlFunction()] public static int testfunc(){//将您的代码放在这里,返回1234; };
将dll放在sql服务器的程序集中(在sql ssms中:数据库->“数据库名称”->可编程性->程序集->新程序集-> ...选择权限设置为“安全”的dll)。
像这样添加一个新函数:创建函数testfunc()以外部名称SqlServerProject1.UserDefinedFunctions.testfunc返回int
(SqlServerProject1是名称空间和dll名称,UserDefinedFunctions是类名称,testfunc是C#和sql server中的函数名称)
进行select dbo.funcname()时,一切工作正常,但是现在将C#中的代码(testfunc)更改为此代码时,我遇到了问题(请参见下面的异常):
[Microsoft.SqlServer.Server.SqlFunction()] public static int testfunc(){WebClient webC = new WebClient(); WebRequest req = HttpWebRequest.Create(“ http:// axdev:8090 ”); 返回12345; }
消息6522,级别16,状态2,第1行在执行用户定义的例程或聚合“ testfunc”的过程中发生了.NET Framework错误:System.Security.SecurityException:请求类型为'System.Security.Permissions.SecurityPermission的许可,mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'失败。 System.Security.SecurityException:位于System.Security.CodeAccessSecurityEngine.Assert处的System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken,CodeAccessPermission需求,StackCrawlMark和stackMark,Int32创建)(System.Security.CodeAccessPermission.Assert处的CodeAccessPermission上限,StackCrawlMark和stackMark) ()在UserDefinedFunctions.testfunc()
SqlAssembly'SqlServerProject1'创建失败。 (Microsoft.SqlServer.Smo)
要获取帮助,请单击: http : //go.microsoft.com/fwlink? .FailedOperationExceptionText&EvtID =创建+ SqlAssembly&LINKID = 20476
附加信息:
执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)
为程序集“ SqlServerProject1”创建组件失败,因为程序集“ SqlServerProject1”未获得PERMISSION_SET = UNSAFE的授权。 如果满足以下任一条件,则对程序集进行授权:数据库所有者(DBO)具有UNSAFE ASSEMBLY权限,并且数据库具有TRUSTWORTHY数据库属性。 或使用具有相应登录名并具有UNSAFE ASSEMBLY权限的证书或非对称密钥对程序集进行签名。 (Microsoft SQL Server,错误:10327)
要获取帮助,请单击: http : //go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.3128&EvtSrc=MSSQLServer&EvtID=10327&LinkId=20476
纽扣:
========
一个新问题-在运行alter database'mydb'时,将其设置为可信任,然后再次添加具有“ permission set” =无限制的程序集时,出现一个新错误。
标题:Microsoft SQL Server Management Studio
SqlAssembly'SqlServerProject1'创建失败。 (Microsoft.SqlServer.Smo)
要获取帮助,请单击: http : //go.microsoft.com/fwlink? .FailedOperationExceptionText&EvtID =创建+ SqlAssembly&LINKID = 20476
- - - - - - - - - - - - - - - 附加信息:
执行Transact-SQL语句或批处理时发生异常。 (Microsoft.SqlServer.ConnectionInfo)
主数据库中记录的数据库所有者SID与数据库“ mydb”中记录的数据库所有者SID不同。 您应该通过使用ALTER AUTHORIZATION语句重置数据库“ mydb”的所有者来纠正这种情况。 (Microsoft SQL Server,错误:33009)
要获取帮助,请单击: http : //go.microsoft.com/fwlink?ProdName=Microsoft%20SQL%20Server&ProdVer=11.00.3128&EvtSrc=MSSQLServer&EvtID=33009&LinkId=20476
谢谢 :)
将权限更改为无限制访问是一种不良做法。 最好您创建一个具有不受限制的权限的新登录访问并将其用于clr调用。 您必须在clr程序集中使用某些线程或套接字编程。 它确实需要不受限制的访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.