我一直在处理存储过程中的单个选择因权限问题而失败的问题,我们将其跟踪到对同义词的调用:
USE DatabaseA
GO
CREATE SYNONYM [dbo].[DatabaseB_dbo_TableT] FOR [DatabaseB].[dbo].[TableT]
GO调试时,我们在中设置了许多跟踪,以查看发生了什么。
作为保存最终交付数据的表的数据库,DatabaseB几乎没有连接,因此我们能够在没有任何其他过滤器的情况下设置分析器,而不是DatabaseName (并且不包括分析器的应用程序名称)。
如果我直接从SELECT中获得TableT,我的查询将如预期的那样显示在DatabaseB的分析器中。
但是,如果我通过同义词访问相同的数据,它只会出现在DatabaseA的分析器中,而不会显示在DatabaseB中,正如我所认为的那样。
这真的是原意吗?虽然我还没有用不同的用户/模式(对审计进行了实验)检查过这一点,但在我看来,我可以访问数据库中的数据,而不需要在一个应该记录数据库中任何事情的分析器中反映这一点,这似乎有悖于直觉。
我希望有人能对此提供一些见解。
发布于 2011-12-14 13:39:25
该查询是在DatabaseA中运行的,而不是在DatabaseB中运行的,因此我认为这是通过设计来实现的。也就是说,SQL捕获“连接数据库上下文是什么”而不是“我正在访问的对象是什么数据库”。
这是有意义的:每个数据库在逻辑上是相互隔离的。使用同义词或其他跨数据库查询是一种特例,因为不能确保所有数据库都同步(特别是在恢复前后),也不能强制执行外键等。
另一个例子..。
USE DatabaseD
GO
SELECT *
FROm
DatabaseA.dbo.TableA A
JOIN
DatabaseB.dbo.TableB B ON ..
JOIN
DatabaseC.dbo.TableC C ON ..它在DatabaseD中运行,所以这就是你在分析器中捕获的东西。
解决办法?据我所知(虽然我还没有尝试),您无法区分访问对象的数据库,只能区分连接的数据库。
https://dba.stackexchange.com/questions/9148
复制相似问题