Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何根据用户对允许数据库的访问权限选择数据库?_C#_Sql_Sql Server 2008 R2 - Fatal编程技术网

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

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

当您以管理员身份登录到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);
但是,当我尝试以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