繁体   English   中英

用户定义函数的SQL Server 2012安全问题

[英]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:

  1. 创建了新的sql项目作为链接(我选择了Visual C#CLR数据库对象,选择了服务器+数据库)
  2. 添加用户定义的功能:

    使用系统; 使用System.Data; 使用System.Data.SqlClient; 使用System.Data.SqlTypes; 使用Microsoft.SqlServer.Server;

    公共局部类UserDefinedFunctions {[Microsoft.SqlServer.Server.SqlFunction()] public static int testfunc(){//将您的代码放在这里,返回1234; };

  3. 将dll放在sql服务器的程序集中(在sql ssms中:数据库->“数据库名称”->可编程性->程序集->新程序集-> ...选择权限设置为“安全”的dll)。

  4. 像这样添加一个新函数:创建函数testfunc()以外部名称SqlServerProject1.UserDefinedFunctions.testfunc返回int

(SqlServerProject1是名称空间和dll名称,UserDefinedFunctions是类名称,testfunc是C#和sql server中的函数名称)

  1. 进行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; }

    1. 运行select dbo.testfunc()时发生异常,我得到:

消息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()

  1. 我无法创建权限集=“ unrestricted”的程序集(与第3步相同,但使用“ unrestricted”,因为出现错误:

标题: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)


为程序集“ 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


纽扣:

  1. 如何解决上述问题才能正确运行新的testfunc代码?

========

一个新问题-在运行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM