为什么 SQL 服务器数据库用户写入了错误的架构?
Why is SQL Server Database User Writing to the Wrong Schema?
在我的数据库中,我有 2 个模式:[dbo] 和 [rch]([rch]
被选为"archived" 数据的名称,这样 table 就不会出现在 [dbo]
table 之前。
我在 SQL Server Management Studio (SSMS) 中为此 table 创建了一个名为 rchuser 的用户:
- 注意上面添加的用户
rch
被列为默认架构。
- 注意上面这个新用户同时拥有
db_owner
和 rch
。
假设我有这个 SQL 插入:
public static int AddRecord(object value, string sqlConnection)
{
int result = 0;
using (var conn = new System.Data.SqlClient.SqlConnection(sqlConnection))
{
conn.Open();
var sqlCmd =
"INSERT INTO Table1 ([Value], [Stamp]) " +
"VALUES (@Value, GETDATE()); ";
using (var cmd = new System.Data.SqlClient.SqlCommand(sqlCmd, conn))
{
cmd.Parameters.AddWithValue("@Value", value);
result = cmd.ExecuteNonQuery();
}
}
return result;
}
我使用我的 rchuser
凭据向该方法传递了一个连接字符串。
var conn = "Data Source=localhost;Initial Catalog=DatabaseN;User Id=rchuser;Password=password;"
没有错误,结果为 1,但新记录不在我的 [rch]
模式的相应 table 中。
好像数据库完全忽略了这个用户默认使用 [rch]
模式这一事实。
我什至尝试使用 rchuser
登录到 SSMS 数据库以手动执行命令。同样,没有错误。数据进入 [dbo]
.
如何将所有数据库输入定向到另一个模式?
您是否尝试在查询中为 table 指定架构?
var sqlCmd =
"INSERT INTO rch.Table1 ([Value], [Stamp]) " +
"VALUES (@Value, GETDATE()); ";
如果您在一个数据库中有多个模式,那么我的建议是始终明确指定您想要的模式。 Aaron Bertrand a good article 说明了为什么你应该这样做,即使你只有一个架构。
所以将你的sql语句修改为
INSERT INTO [rch].Table1...
你会一切都好。
我注意到这并没有回答你的标题,但它确实回答了你的问题。
至于为什么您的查询没有默认 [rch] 架构,我不知道。我在 SQL Server 2008 R2 中复制了您的设置,当我 运行 您的原始查询时,插入确实按预期进入了 rch table。
编辑:
我进行了一些谷歌搜索,我怀疑您的问题是由于将 sysadmin
服务器角色授予 rchuser
登录导致的。我把我的改成了sa
,现在插入默认进入 [dbo] 架构,即使 rchuser 的默认架构为 [rch]。
因此,如果您删除 sysadmin
服务器角色,它应该会按预期开始工作。
在我的数据库中,我有 2 个模式:[dbo] 和 [rch]([rch]
被选为"archived" 数据的名称,这样 table 就不会出现在 [dbo]
table 之前。
我在 SQL Server Management Studio (SSMS) 中为此 table 创建了一个名为 rchuser 的用户:
- 注意上面添加的用户
rch
被列为默认架构。
- 注意上面这个新用户同时拥有
db_owner
和rch
。
假设我有这个 SQL 插入:
public static int AddRecord(object value, string sqlConnection)
{
int result = 0;
using (var conn = new System.Data.SqlClient.SqlConnection(sqlConnection))
{
conn.Open();
var sqlCmd =
"INSERT INTO Table1 ([Value], [Stamp]) " +
"VALUES (@Value, GETDATE()); ";
using (var cmd = new System.Data.SqlClient.SqlCommand(sqlCmd, conn))
{
cmd.Parameters.AddWithValue("@Value", value);
result = cmd.ExecuteNonQuery();
}
}
return result;
}
我使用我的 rchuser
凭据向该方法传递了一个连接字符串。
var conn = "Data Source=localhost;Initial Catalog=DatabaseN;User Id=rchuser;Password=password;"
没有错误,结果为 1,但新记录不在我的 [rch]
模式的相应 table 中。
好像数据库完全忽略了这个用户默认使用 [rch]
模式这一事实。
我什至尝试使用 rchuser
登录到 SSMS 数据库以手动执行命令。同样,没有错误。数据进入 [dbo]
.
如何将所有数据库输入定向到另一个模式?
您是否尝试在查询中为 table 指定架构?
var sqlCmd =
"INSERT INTO rch.Table1 ([Value], [Stamp]) " +
"VALUES (@Value, GETDATE()); ";
如果您在一个数据库中有多个模式,那么我的建议是始终明确指定您想要的模式。 Aaron Bertrand a good article 说明了为什么你应该这样做,即使你只有一个架构。
所以将你的sql语句修改为
INSERT INTO [rch].Table1...
你会一切都好。
我注意到这并没有回答你的标题,但它确实回答了你的问题。
至于为什么您的查询没有默认 [rch] 架构,我不知道。我在 SQL Server 2008 R2 中复制了您的设置,当我 运行 您的原始查询时,插入确实按预期进入了 rch table。
编辑:
我进行了一些谷歌搜索,我怀疑您的问题是由于将 sysadmin
服务器角色授予 rchuser
登录导致的。我把我的改成了sa
,现在插入默认进入 [dbo] 架构,即使 rchuser 的默认架构为 [rch]。
因此,如果您删除 sysadmin
服务器角色,它应该会按预期开始工作。