在我的数据库中,我有两个模式:[dbo]和[rch]([rch]被选为“存档”数据的名称,这样这些表就不会出现在[dbo]表之前)。
我在SQL Server Management Studio(SSMS)中为此表创建了一个名为rchuser的用户:
c# - 为什么SQL Server数据库用户写入错误的架构?-LMLPHP
请注意,添加用户时,rch列为默认模式。
c# - 为什么SQL Server数据库用户写入错误的架构?-LMLPHP
请注意,这个新用户同时拥有db_ownerrch
c# - 为什么SQL Server数据库用户写入错误的架构?-LMLPHP
假设我有一个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,但新记录不在my[rch]架构的对应表中。
这就好像数据库完全忽略了这样一个事实:这个用户默认使用[rch]模式。
我甚至尝试用rchuser登录到ssms数据库来手动执行命令。同样,没有错误。数据进入[dbo]
如何将所有数据库输入定向到另一个架构?

最佳答案

如果数据库中有多个模式,那么我的建议是始终显式指定所需的模式。Aaron Bertrand已经知道了为什么要这么做,即使你只有一个模式。
所以将sql语句修改为
INSERT INTO [rch].Table1...
你会很好的。
我注意到这并不能回答你的题目,但它确实回答了你的问题。
至于为什么查询没有默认到[rch]模式,我不知道。我在SQL Server 2008 R2中复制了您的设置,当我运行原始查询时,插入将按预期进入RCH表。
编辑
我在google上搜索了一下,我怀疑您的问题是由于将sysadmin服务器角色授予rchuser登录而引起的。我把我的改成了SA
a good article
,现在插入默认进入[dbo]模式,即使rchuser的默认模式是[rch]。
因此,如果删除sysadmin服务器角色,它应该按预期开始工作。

10-05 19:23