在我的数据库中,我有两个模式:[dbo]和[rch]([rch]
被选为“存档”数据的名称,这样这些表就不会出现在[dbo]
表之前)。
我在SQL Server Management Studio(SSMS)中为此表创建了一个名为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,但新记录不在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
服务器角色,它应该按预期开始工作。