c# - 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 对整个数据库具有数据读取者角色。
你知道为什么会这样吗?我的数据库管理员也无法帮助我,而且这似乎不是网络问题,因为连接似乎有效。
解决方案
当您的连接字符串中有此内容时:
Trusted_Connection=True;
这部分连接字符串被忽略:
User ID=DOMAIN\username;Password=verySecurePassword;
受信任的连接和集成的安全性意味着您始终以运行程序进程的帐户连接到服务器。您无需指定密码;相反,程序将传递为运行该进程的用户颁发的身份验证令牌,并且数据库将根据该令牌进行验证。
如果您需要使用域登录,则必须以该用户身份运行您的程序。如果需要使用用户名/密码,则必须使用 Sql Server 中定义的非域帐户使用 Sql 身份验证。
推荐阅读
- cassandra - Cassandra 中 Memtables 和 SStables 中的数据存储
- c# - Iphone 移动应用程序中的圆形图像范围 (Xamarin.Ios / C#)
- google-analytics - 在重定向到 Leadpages 登录页面的域上设置 Google Analytics
- python - Python 3 中的 Python 2 打印功能
- android - Periodic WorkManager 不等待图像下载完成来设置壁纸
- sql - 在 Excel 中选择 Range 并替换 Nulls
- sql - 在 .NET Standard 2.0 项目中创建 SqlConnection
- c - 无法编译来自 The C Programming Language 2nd 的示例代码,第 29 页
- azure-webjobs - 如何以编程方式设置 TimerTrigger 值?
- regex - 获取括号正则表达式之间的文本,而不是带引号的文本