当您以管理员身份登录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”。
现在有没有办法在创建适配器之前检查用户权限?例如,如果用户只能访问特定数据库或数据库,则只显示(或加载)这些数据库?如果用户具有完全权限,则执行我在此处编写的适配器命令。 如果我的问题不容易理解,请告诉我,我会尽可能地澄清它。
谢谢
答案 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。这是有效的,因为我现在不必去做模型上的用户映射。但是,如果查询只能返回当前用户拥有权限的数据库,那就太棒了。