如何根据用户对允许数据库的访问权限选择数据库?

时间:2013-01-17 15:11:22

标签: c# sql sql-server-2008-r2

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

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”无法访问当前安全上下文下的数据库“model”。

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

谢谢

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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。这是有效的,因为我现在不必去做模型上的用户映射。但是,如果查询只能返回当前用户拥有权限的数据库,那就太棒了。