我被要求对一个旧的asp经典应用程序进行一些更改。生产服务器和他们用于测试和开发的服务器,或者20多个路由器,从我输入到看到类型之间的滞后时间非常可怕。所以我在这里设置了一个服务器,就像他们(MSServer2008)安装的MSSQLServer2008R2一样。我以为我配置的数据库和他们的一样。他们有成百上千行的旧vbscript。
我在远程端备份了测试数据库,将其复制到服务器上并在那里恢复。我抄了他们的剧本。网站已启动并运行。但是任何需要对数据库进行查询的操作都会产生错误"无效的对象名称'atable'。查看他们的代码,任何地方都没有完全限定的名称。我登录到远程服务器启动Management Studio,确信你不需要完全限定的名称来进行任何查询。我问他们是否可以将所有代码更改为使用完全限定的名字,结果是否定的。"。我问他们是如何配置数据库的,答案是一位前承包商这样设置的。(他们喜欢)
所以我的问题;在MS SQL Server 2008中是否有默认不使用完全限定名称的配置选项?他们怎么能在代码中不使用数据库、所有者、模式呢?我以应用程序用户的身份登录,这似乎也没有帮助。
请注意,我知道我们应该使用完全限定的名称作为最佳实践。我已经阅读了有关业绩收益/亏损的评论。当您自动编写创建数据库脚本时,它们的数据库实例使用模式名称。如果我用那个模式名称作为表名称的序,一切都很好。他们只是不希望我在我为他们编辑或创作的任何剧本中这样做。
未指定对象(从表1中选择*)的解析顺序是sys,然后是用户的默认模式,最后是dbo。因此,SQL Server(给定数据库上下文)将在sys模式中查找表1,然后查找分配的模式(可能是也可能不是dbo),最后查找dbo。只要一切都在dbo中(这是一种非常糟糕的做法,但你一直坚持下去),一切都会找到的。这就像用一个房间来存放所有东西。
我曾为一位非常精明的经理工作,他支持许多数据库,他将所有对象识别为三部分名称(databasename.schema.object)作为一种惯例,但我知道微软打算在未来停止支持这种类型的名称解析。但至少,脚本中所有对象的schema_name.object_name都非常常见。