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

本文关键字:数据库 访问 访问权 权限 选择 用户 何根 | 更新日期: 2023-09-27 17:53:51

当您以具有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"无法在当前安全上下文中访问数据库"model"。

现在有一种方法来检查用户权限之前创建适配器?例如,如果用户只能访问特定的数据库,或者数据库只显示(或加载)这些数据库?如果用户有完全权限,那么执行我写在这里的适配器命令。如果我的问题不容易被理解,请告诉我,我会尽可能地解释清楚。

谢谢

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

用户需要在" user Mapping"下拥有数据库(模型)的"db_datareader"权限。

安全 -> 登录 ->右键单击" datareader "(用户)-> 属性-> 用户映射

选择数据库(在您的示例中是模型),然后在下面检查db_datareader角色

好的,我把命令改成这样:

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。这是可行的,因为我现在不需要在模型上做用户映射。但是,如果有一个查询可以只返回当前用户具有权限的数据库,那就太好了。