T-SQL:在不符合条件的情况下访问同一模式中的数据库对象?

时间:2017-09-12 21:23:28

标签: sql-server namespaces

我有一个包含许多存储过程,函数,视图和表的项目。

我目前在同一架构内的数据库中部署了项目。对于这个例子,我们称之为“mainproject”

现在,我的任务是在同一个数据库中创建一个重复的项目 。显而易见的解决方案是将所有对象克隆到另一个模式。我已经能够使用一些SQL脚本来做到这一点。所以现在我有另一个名为“secondproject”的模式,其中包含第一个模式中的所有对象。

问题是,在我的所有函数,视图和过程中,引用了原始模式,例如: DECLARE @someVar INT = mainproject.getId(@someObject)SELECT someColumn FROM mainproject.someTableUPDATE mainproject.someTable SET someColumn = @someValue WHERE someOtherColumn = @someOtherValue因此执行这些功能最终会引用错误的架构。

通过数百个视图,过程和函数来查找和替换所有出现的模式mainproject将是一个单调乏味且可能不可靠的过程。

我的问题是,有没有办法在引用任何对象时指定“在当前模式中”?

只需DECLARE @someVar INT = getId(@someObject) 'getId' is not a recognized built-in function name.,我就无法保存程序。

编辑:下面的第一个答案有助于了解情况。如果您没有在访问对象时指定模式,则它会假定它在您的默认模式中。

问题是,在我将运行我的DDL脚本的生产服务器上,我的用户帐户的服务器默认架构是dbo。应用程序用户只能访问DML语句,因此我无法使用该帐户运行创建脚本。

我想如果没有办法存储过程假设不合格的对象在它所在的同一模式中,我将不得不在生成脚本后求助/替换....

1 个答案:

答案 0 :(得分:0)

在SQL Server中,您谈论的是模式。如果未指定,则数据库引擎将默认为当前用户的默认架构。默认情况下,这是dbo。简而言之,如果在不同的模式中具有相同名称的对象,则需要指定要在查询中使用的模式。