C# 如何根据用户对允许数据库的访问权限选择数据库?
当您以管理员身份登录到SQL Server 2008 R2并具有windows身份验证权限时,将执行以下命令C# 如何根据用户对允许数据库的访问权限选择数据库?,c#,sql,sql-server-2008-r2,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
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);
但是,当我尝试以datareader身份登录时,只有sp_datareader权限,我会遇到一个异常:
服务器主体“datareader”无法在当前安全上下文下访问数据库“model”
现在有没有办法在创建适配器之前检查用户权限?例如,如果用户只能访问特定的数据库,或者只能显示(或加载)这些数据库?若用户拥有完全权限,那个么执行我在这里编写的适配器命令。
如果我的问题不那么容易理解,请告诉我,我会尽量澄清
谢谢用户需要在“用户映射”下对您的数据库(模型)拥有“db\u 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。这是可行的,因为我现在不必在模型上进行用户映射。但是,如果有一个查询只能返回当前用户有权限的数据库,那就太好了。你不是在尝试连接到“模型”数据库吧?你可以用
try..catch
block来结束它。我想我下次在评论之前会真正阅读查询。正如影子向导所评论的,您可以将代码包装在try/catch中。事实上,您可以首先将测试查询包装在try/catch中,以首先确定权限,然后相应地进行分支。但是,我很好奇为什么您首先要查询模型数据库。不,我没有尝试连接。我确实用try-catch包装了它,但这并不能解决问题,因为我需要加载正确的数据库,实际上是datareader可以访问的数据库(我已经允许datareader用户访问一个数据库,称为Test);是的,这很有效,但我仍然需要只加载该用户有权访问的数据库。就像我说的,他可以访问数据库测试,所以我需要加载那个数据库。如果datareader访问的数据库不止一个,那么如何加载它们?使用我为dataadapter编写的命令,所有数据库都会被加载,这在用户有权访问所有数据库时非常好,但对于datareader,我只需要datareader有权访问的那些数据库。然后刚刚添加的是WARE has_dbaccess(dtb.name)=1