首先:这不是一个不起作用的特定语句。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'.
即使我在数据库所在的服务器上运行程序,我也会收到同样的错误。
我的连接字符串看起来像这样:
Data Source=ServerSomething;Initial Catalog=MyDb;User ID=DOMAINusername;Password=verySecurePassword;Trusted_Connection=True;
用户A在整个数据库中具有数据读取器角色。
你知道为什么会这样吗?我的数据库管理员也帮不了我,而且这似乎不是网络问题,因为连接似乎正常。
当你的连接字符串中有这个时:
Trusted_Connection=True;
连接字符串的这一部分被忽略:
User ID=DOMAINusername;Password=verySecurePassword;
受信任的连接和集成的安全性意味着您始终作为运行程序进程的帐户连接到服务器。您不需要指定密码;相反,程序将传递为运行进程的用户颁发的身份验证令牌,数据库将根据该令牌进行验证。
如果需要使用域登录,则必须以该用户身份运行程序。如果需要使用用户名/密码,则必须使用Sql Server中定义的非域帐户进行Sql身份验证。