我已经厌倦了寻找这个,但我找不到任何东西。
我在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
并且此查询存储在主数据库中,它是否会在主数据库中运行并一直返回到第二个数据库并返回数据,还是会在第二个数据库中运行并直接选择结果?
(希望你理解我的问题)
答案 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(通常设置为最新的兼容级别)和运行查询,引用授予访问权限的任何其他数据库中的数据。使用这些新功能不会引发异常