1

当您以具有 Windows 身份验证权限的 SQL Server 2008 R2 管理员身份登录时,我会执行以下命令。

var sqlAdapter = 
    new SqlDataAdapter(@"select dtb.name as [Name],
                                CAST(case when dtb.name in ('master','model','msdb','tempdb') then 1 
                                          else dtb.is_distributor end AS bit) AS [IsSystemObject]
                         from model.sys.databases dtb", connection);
sqlAdapter.Fill(table);

但是,当我尝试以只有 sp_datareader 权限的 datareader 身份登录时,出现异常:

服务器主体“datareader”无法在当前安全上下文下访问数据库“模型”。

现在有没有办法在创建适配器之前检查用户权限?例如,如果用户只能访问特定数据库或数据库仅显示(或加载)这些数据库?如果用户具有完全权限,则执行我在此处编写的适配器命令。如果我的问题不是那么容易理解,请告诉我,我会尽可能地澄清它。

谢谢

4

2 回答 2

0

用户需要在“用户映射”下对您的数据库(模型)拥有“ db_datareader ”权限。

安全->登录-> 右键单击​​“ datareader ”(您的用户)->属性->用户映射

选择数据库(在您的情况下为模型),然后在下方检查 db_datareader 角色。

于 2013-01-17T15:30:25.650 回答
0

好的,我已将命令更改为:

select dtb.name as [Name],
CAST(case when dtb.name in ('master','model','msdb','tempdb') then 1 
else dtb.is_distributor end AS bit) AS [IsSystemObject]
from sys.databases dtb

删除了模型,现在它只有 sys.databases。这是有效的,因为我现在不必去在模型上进行用户映射。但是,如果查询只能返回当前用户具有权限的数据库,那就太好了。

于 2013-01-17T18:53:34.760 回答