【发布时间】:2013-04-08 19:56:03
【问题描述】:
我用 C# 编写了一个简单的用户定义函数,它获取 IP 地址并根据它返回主机名,代码如下:
public partial class UserDefinedFunctions
{
[Microsoft.SqlServer.Server.SqlFunction]
public static SqlString getname(String ipAddress)
{
System.Data.SqlClient.SqlClientPermission pSql = new SqlClientPermission(System.Security.Permissions.PermissionState.Unrestricted);
pSql.Assert();
System.Security.PermissionSet psql1 = new PermissionSet(System.Security.Permissions.PermissionState.Unrestricted);
psql1.Assert();
System.Net.DnsPermission psql = new DnsPermission(System.Security.Permissions.PermissionState.Unrestricted);
psql.Assert();
System.Security.Permissions.SecurityPermission psql2 = new SecurityPermission(System.Security.Permissions.PermissionState.Unrestricted);
psql2.Assert();
IPHostEntry host = Dns.GetHostEntry(ipAddress);
return new SqlString(host.HostName.ToString());
}
}
现在我已经部署了它,但是当我尝试在 sql 中调用这个函数时:select dbo.getname('10.10.10.10')
它返回此错误:
Msg 6522, Level 16, State 2, Line 7
A .NET Framework error occurred during execution of user-defined routine or aggregate "getname":
System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at System.Security.CodeAccessSecurityEngine.CheckNReturnSO(PermissionToken permToken, CodeAccessPermission demand, StackCrawlMark& stackMark, Int32 unrestrictedOverride, Int32 create)
at System.Security.CodeAccessSecurityEngine.Assert(CodeAccessPermission cap, StackCrawlMark& stackMark)
at System.Security.CodeAccessPermission.Assert()
at UserDefinedFunctions.getname(String ipAddress)
我已经在互联网上进行了爬网,但没有发现任何内容。请提出建议。
【问题讨论】:
-
您如何注册您的程序集?是否标记为外部访问?
-
我从一个非常相似的 CLR 函数中得到了完全相同的错误。我正在使用 WindowsIdentity.Getcurrent() 返回用户信息。我的程序集在 SQL WITH PERMISSION_SET = External_Access 中注册。有人解决过这个问题吗?
标签: sql-server c#-4.0