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

  • 问题

  • 我在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)

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

    2012年12月4日 6:32

答案

全部回复

  • 给调用的用户授予 VIEW SERVER STATE 权限

    • 已标记为答案 xiagao 2012年12月4日 7:48
    2012年12月4日 6:45
  • 谢谢!这个问题解决了。不过又遇到新的问题,用另一个用户执行时,遇到下面的错误:

    Msg 229, Level 14, State 5, Line 1

    拒绝了对对象 'MyType' (数据库 'MyDB',架构 'dbo')的 EXECUTE 权限。

    请问这个需要怎么设置权限呢?

    2012年12月4日 12:30
  • Grant exec permission in dbo schema to the user.
    2012年12月4日 21:30