通过本地网络从 Web 应用程序访问架构时出错

Error accessing Schema from web app over over local network

我有一个在 运行 连接服务器的计算机上正常工作的 Web 应用程序,但是当我尝试 运行 通过本地网络在另一台设备上使用该 Web 应用程序时,出现此错误:

The specified schema name "WORKGROUP\LAPTOP-1" either does not exist or you do not have permission to use it.

我要执行的命令如下:

protected void Home_pt()
{
    string nametime;
    string name;
    string time;
    string tname = null;
    SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");

    if (thiddenfield.Value == String.Empty)
    {
        Show("error: empty tname");
    }
    else
    {
        tname = thiddenfield.Value;
    }

    using (var cmd = new SqlCommand("SELECT name FROM trecordTable WHERE name='" + tname + "'", conn))
    {
        conn.Open();
        using (var reader = cmd.ExecuteReader())
        {
            List<string> namedatelist = new List<string>();
            while (reader.Read())
            {
                name = reader["name"].ToString();
                time = DateTime.Now.ToString("MM-dd-yyyy");
                namedatelist.Add(name + time);
            }
            nametime = Regex.Replace(namedatelist[0].ToString(), "[^0-9a-zA-Z]+", "");
            Session["nametime"] = nametime;
            hftstate.Value = nametime;
        }
    }
}

protected void Fill_t(object sender, EventArgs e)
{
    var nametime = Session["nametime"].ToString();
    SqlConnection conn = new SqlConnection("Data Source=localhost\SQLEXPRESS;AttachDbFilename=C:\Users\Public\public website\slDataBase.mdf;Integrated Security=True;Trusted_Connection=True;");

    conn.Open();

    using (var cmdtx1 = new SqlCommand("IF OBJECT_ID('" + nametime + "') IS NULL CREATE TABLE " + nametime + "([Id]    INT   IDENTITY NOT NULL,  [item]  NVARCHAR(50) NULL,  [CtrlType] NVARCHAR(50) NULL,  [six] NVARCHAR(50) NULL,  [seven]  NVARCHAR(50) NULL,  [eight]  NVARCHAR(50) NULL); IF NOT EXISTS(SELECT item FROM " + nametime + ") INSERT INTO " + nametime + " (item,CtrlType,hflabel) VALUES ('At','atscroll','cstat')", conn))
    {
        cmdtx1.ExecuteNonQuery();
    }
}

我应该在 SSMS 中编辑权限吗?

此外,我知道它容易受到注入攻击,但我想先解决这个问题。

哇,所以 post 由 Ubercoder 发布了大约 30 秒(然后删除了?)!

“我怀疑 nametime 没有被设置为包含所需的模式 - 通常这是 [dbo]

这应该有效

using (var cmdtx1 = new SqlCommand(
 "IF OBJECT_ID('[dbo]." + nametime + @"') IS NULL 
    CREATE TABLE [dbo]." + nametime +  @"
     ([Id] INT IDENTITY NOT NULL,  
      [item]  NVARCHAR(50) NULL,  
      [CtrlType] NVARCHAR(50) NULL,  
      [six] NVARCHAR(50) NULL,  
      [seven]  NVARCHAR(50) NULL,  
      [eight]  NVARCHAR(50) NULL
     ); 


 IF NOT EXISTS(SELECT item FROM [dbo]." + nametime + @") 
  INSERT INTO [dbo]." + nametime + @"
      (item,CtrlType,hflabel) 
  VALUES ('At','atscroll','cstat')",
 conn))
{
cmdtx1.ExecuteNonQuery();
}

Ubercoder 如果您重新post您的答案,我会将其标记为正确答案。

任何人都可以解释为什么这样做吗?

因为你在连接字符串中使用了Integrated Security=True;Trusted_Connection=True,哪个用户连接到数据库以及使用哪个默认模式取决于Windows环境。

您的 IIS 可能设置为对远程连接使用不同于本地连接的 Windows 用户凭据。或者,当您还在 IIS 中为您的应用程序启用集成 Windows 身份验证时,客户端计算机上的登录 Windows 用户将用于对数据库进行身份验证。

因此,要么不使用集成安全性,要么确保所有希望能够连接的用户都可以访问架构 dbo 并将其用作默认架构。

请参阅 this article 了解如何为 Windows 网络组设置默认架构。


警告:个人意见

按照 Ubercoder 的建议在 SQL 语句中指定模式名称也可以,但这通常不是一个好主意,因为这会使应用程序迁移到 SQL 服务器用于与不同的应用程序共享数据库,或者当您想要实现 multi-tenant-scenario.

开发人员也很容易忘记在 sql 语句中添加模式前缀。当开发人员使用默认架构为 dbo 的登录名时,在开发过程中不会轻易发现此错误。