试图了解存储过程的行为

时间:2018-04-05 15:08:00

标签: sql-server database stored-procedures

我已经厌倦了寻找这个,但我找不到任何东西。

我在SQL Server中有三个数据库,虽然所有存储过程都在2018-04-05 11:04:09 DEBUG [-nio-80-exec-10] RequestAwareAuthenticationSuccessHandler : Redirecting to DefaultSavedRequest Url: http://localhost/error 2018-04-05 11:04:09 DEBUG [-nio-80-exec-10] o.s.security.web.DefaultRedirectStrategy : Redirecting to 'http://localhost/error' 数据库中,但它们可以与其他数据库中的表一起使用。

我的问题是:如果您有查询

Main

并且此查询存储在主数据库中,它是否会在主数据库中运行并一直返回到第二个数据库并返回数据,还是会在第二个数据库中运行并直接选择结果?

(希望你理解我的问题)

3 个答案:

答案 0 :(得分:1)

我认为你误解了数据库和实例之间的区别。

实例是运行SQL服务的软件。每个实例可以有多个数据库。例如,每个SQL Server实例都有一个master数据库和一个tempdb数据库,这些是系统数据库。您可以创建任意数量的用户数据库。所有这些数据库将由同一个SQL Server实例(在同一台机器上)处理。

特定客户端会话首先连接到实例,然后连接到特定数据库,这就是为什么要包含默认情况下连接到连接字符串(或登录)的数据库的原因。当您编写select name from SecondDatabase.dbo.SomeTable时,即使您的会话链接到任何其他数据库,您也告诉SQL服务从SecondDatabase检索数据。然后,引擎将使用您的登录凭据来匹配其他数据库的用户(因为用户通过数据库并按实例登录),以在搜索数据之前验证它是否具有足够的权限来查询该表。

完全不同的故事是尝试从另一个实例(机器)访问数据,您需要一个链接服务器,一个openrowset等。

答案 1 :(得分:0)

上面的(现在已编辑的)查询将始终在SecondDatabase.dbo.SomeTable上执行,即使活动数据库上下文是另一个数据库,即使活动用户具有不同的默认架构。这是因为对象SomeTable符合架构和架构所有者的要求。

测试以说明以下内容仍然返回执行结果(假设对象存在且活动用户上下文可以访问它们

USE [OtherDatabaseSchema]
GO

SELECT TOP 10 *
FROM [SecondDatabase].[dbo].[SomeTable]

答案 2 :(得分:0)

use FirstDatabase
select name 
from SecondDatabase.dbo.SomeTable 
where id = 56

问题:

  

它会在主数据库中运行并一直到第二个   数据库并返回数据,或者它将在第二个数据库中运行   你有直接选择结果吗?

你的第一个假设是正确的:

此查询将在第一个数据库中运行,它将使用第一个数据库的上下文和所有设置(ANSI,查询优化器和统计相关),但将从第二个数据库的表中获取数据

只是生活中的一个例子:如果数据库必须保持旧的兼容模式,但偶尔需要使用新的T-SQL功能,查询可以将上下文切换到tempdb(通常设置为最新的兼容级别)和运行查询,引用授予访问权限的任何其他数据库中的数据。使用这些新功能不会引发异常