当前位置 > 首页 > Sql

SQL Server普通用户执行SQL/CLR User-defined Type函数并访问数据库的权限问题

2012-12-4 14:27:00来源:Sql

我在SQL/CLR assembly中定义了一个User-defined Type,它的一个成员函数会访问数据库,代码如下:

[SqlMethod(SystemDataAccess = SystemDataAccessKind.Read)]
public static MyType Parse(SqlString param)
{
    var conn = new SqlConnection("context connection = true;");
    conn.Open();
    
    var cmd = conn.CreateCommand();
    
    cmd.CommandText = @"SELECT connection_id
        FROM sys.dm_exec_connections
        WHERE session_id = @@SPID
        AND parent_connection_id IS NULL";
    
    Guid id;
    
    using (var reader = cmd.ExecuteReader())
    {
        while (reader.Read())
        {
            id = reader.GetGuid(0);
            
            break;
        }
    }
    
    conn.Close();
    
    return new MyType(id, param.Value);
}

用sa用户能够成功调用这个函数,但是使用普通用户调用就出现下面的错误:

消息 6522,级别 16,状态 1,第 1 行
在执行用户定义例程或聚合 "MyType" 期间出现 .NET Framework 错误:
System.Data.SqlClient.SqlException: 用户没有执行此操作的权限。
System.Data.SqlClient.SqlException:
   在 System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   在 System.Data.SqlClient.SqlDataReaderSmi.InternalNextResult(Boolean ignoreNonFatalMessages)
   在 System.Data.SqlClient.SqlDataReaderSmi.NextResult()
   在 System.Data.SqlClient.SqlCommand.RunExecuteReaderSmi(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   在 System.Data.SqlClient.SqlCommand.ExecuteReader()
   在 QuantInv.Securities.MyType.Parse(SqlString param)

请问如何设置权限使得普通用户能调用上述函数呢?谢谢!