【问题标题】:How to NOT use fully qualified table names in MS SQL Server 2008 R2如何在 MS SQL Server 2008 R2 中不使用完全限定的表名
【发布时间】:2015-06-04 01:12:40
【问题描述】:

有人要求我对旧的 asp-classic 应用程序进行一些更改。生产服务器和他们用于测试和开发的服务器或 20 多个路由器之外的服务器以及我打字和看到类型之间的延迟时间是可怕的。所以我在这里设置了一个服务器,就像他们的(MS Server 2008)安装了MS SQL Server 2008 R2。我以为我像他们一样配置了我的数据库。他们有成千上万行的旧 vbscript。

我在远程端备份了测试数据库,将其复制到我的服务器并在那里恢复。我复制了他们已经完成的脚本正文。网站已启动并正在运行。但是....任何需要查询数据库的东西都会产生错误“无效的对象名称'atable'。查看他们的代码,任何地方都没有完全限定的名称。我登录到远程服务器启动Management Studio果然你不需要完全限定名称来进行任何查询。我问他们是否可以将所有代码更改为使用完全限定名称,答案是否定的。我问他们如何配置数据库,答案是前者承包商就是这样设置的。(他们喜欢)

所以我的问题; MS SQL Server 2008 中是否有默认不使用完全限定名称的配置选项?他们怎么能在代码中不使用数据库、所有者、模式?我以应用程序用户身份登录,这似乎也没有帮助。

请,我知道我们应该使用完全限定名称作为最佳做法。我已经阅读了有关性能增益/损失的 cmets。当您自动编写创建数据库脚本时,他们的数据库实例使用模式名称。如果我使用该模式名称来为表名添加前缀,那么一切都很好。他们只是不希望我在我为他们编辑或创建的任何脚本中这样做。

【问题讨论】:

  • 当您将用户更改为所有用户都具有相同的默认架构时会发生什么(我猜,dbo 是所有这些对象所在的位置)?由于您指出的原因,它仍然会完全糟糕,但至少没有人需要更正他们的代码。
  • 只有一个用户。他们的应用程序页面使用该用户 ID 登录。
  • 糟糕,点击“添加评论”太快了。这些表归该用户所有,并且架构名称与用户的名称匹配。
  • 您没有提及此用户的默认架构。
  • 和用户的默认架构都是一样的。为了说明,我有一个名为 DBtest 的数据库。该数据库归 DBtest 所有。有一个名为 DBtest 的系统登录。还有一个名为 DBtest 的数据库用户,其默认模式也是 DBtest。

标签: sql-server asp-classic fully-qualified-naming


【解决方案1】:

未指定的对象的解析顺序(从 table1 中选择 *)是 sys,然后是用户的默认架构,最后是 dbo。因此 SQL Server(给定数据库上下文)将在 sys 架构中查找 table1,然后是分配的架构(可能是也可能不是 dbo),最后是 dbo。只要一切都在 dbo 中(这是非常糟糕的做法,但你坚持这样做)一切都会找到。就像用一个房间来存放所有东西一样。

我曾为一位非常精明的经理工作过,他支持许多数据库,他习惯于将他的所有对象识别为三个部分名称 -databasename.schema.object 但我了解 Microsoft 打算停止支持这种类型的名称未来的决议。但至少在脚本中看到所有对象的 schema_name.object_name 是非常普遍的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多