为什么 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 的用户:

假设我有这个 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 服务器角色,它应该会按预期开始工作。