首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同义词的执行是否没有登录到目标数据库中?

同义词的执行是否没有登录到目标数据库中?
EN

Database Administration用户
提问于 2011-12-14 13:05:08
回答 1查看 188关注 0票数 2

我一直在处理存储过程中的单个选择因权限问题而失败的问题,我们将其跟踪到对同义词的调用:

代码语言:javascript
运行
复制
USE DatabaseA
GO
CREATE SYNONYM [dbo].[DatabaseB_dbo_TableT] FOR [DatabaseB].[dbo].[TableT]
GO

调试时,我们在中设置了许多跟踪,以查看发生了什么。

作为保存最终交付数据的表的数据库,DatabaseB几乎没有连接,因此我们能够在没有任何其他过滤器的情况下设置分析器,而不是DatabaseName (并且不包括分析器的应用程序名称)。

如果我直接从SELECT中获得TableT,我的查询将如预期的那样显示在DatabaseB的分析器中。

但是,如果我通过同义词访问相同的数据,它只会出现在DatabaseA的分析器中,而不会显示在DatabaseB中,正如我所认为的那样。

这真的是原意吗?虽然我还没有用不同的用户/模式(对审计进行了实验)检查过这一点,但在我看来,我可以访问数据库中的数据,而不需要在一个应该记录数据库中任何事情的分析器中反映这一点,这似乎有悖于直觉。

我希望有人能对此提供一些见解。

EN

回答 1

Database Administration用户

回答已采纳

发布于 2011-12-14 13:39:25

该查询是在DatabaseA中运行的,而不是在DatabaseB中运行的,因此我认为这是通过设计来实现的。也就是说,SQL捕获“连接数据库上下文是什么”而不是“我正在访问的对象是什么数据库”。

这是有意义的:每个数据库在逻辑上是相互隔离的。使用同义词或其他跨数据库查询是一种特例,因为不能确保所有数据库都同步(特别是在恢复前后),也不能强制执行外键等。

另一个例子..。

代码语言:javascript
运行
复制
USE DatabaseD
GO
SELECT *
FROm
  DatabaseA.dbo.TableA A
  JOIN 
  DatabaseB.dbo.TableB B ON ..
  JOIN 
  DatabaseC.dbo.TableC C ON ..

它在DatabaseD中运行,所以这就是你在分析器中捕获的东西。

解决办法?据我所知(虽然我还没有尝试),您无法区分访问对象的数据库,只能区分连接的数据库。

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/9148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档