首页 > 解决方案 > SQL 查询在 SSMS 中有效,但在 C# 中无效:SELECT denied

问题描述

首先:它不是一个不起作用的特定语句。SELECT * FROM [TABLE];也不起作用。当我以用户 A 身份在 SSMS 中运行它时,它工作得非常好。当我像这样在 C# 中使用它时:

string sqlCommand = "SELECT * FROM [TABLE];"

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["Name"].ToString()))
using (var command = new SqlCommand(sqlCommand, conn))
{
    conn.Open();

    using (var dataReader = command.ExecuteReader())
    {
        while (dataReader.Read())
        {
            // work with results
        }
    }
}

我使用 try-catch 记录此代码块,并收到以下错误消息:System.Data.SqlClient.SqlException (0x80131904): The SELECT permission was denied on the object 'TABLE', database 'MyDb', schema 'dbo'.

即使我在 db 所在的服务器上运行程序,我也会得到同样的错误。

我的连接字符串看起来像这样:

Data Source=Server\Something;Initial Catalog=MyDb;User ID=DOMAIN\username;Password=verySecurePassword;Trusted_Connection=True;

用户 A 对整个数据库具有数据读取者角色。

你知道为什么会这样吗?我的数据库管理员也无法帮助我,而且这似乎不是网络问题,因为连接似乎有效。

标签: c#sql-serverssmssqldatareader

解决方案


当您的连接字符串中有此内容时:

Trusted_Connection=True;

这部分连接字符串被忽略:

User ID=DOMAIN\username;Password=verySecurePassword;

受信任的连接和集成的安全性意味着您始终以运行程序进程的帐户连接到服务器。您无需指定密码;相反,程序将传递为运行该进程的用户颁发的身份验证令牌,并且数据库将根据该令牌进行验证。

如果您需要使用域登录,则必须以该用户身份运行您的程序。如果需要使用用户名/密码,则必须使用 Sql Server 中定义的非域帐户使用 Sql 身份验证。


推荐阅读