【问题标题】:TSQL: Create a view that accesses multiple databasesTSQL:创建访问多个数据库的视图
【发布时间】:2011-01-09 17:38:43
【问题描述】:

我有一个特殊情况,

例如在数据库A中的表ta中,它存储了我购买的所有产品

table ta(
id,
name,
price
)

在数据库B的表tb中,它包含人们可以购买的所有产品

table tb(
id,
name,
price
....
)

我可以在数据库A 中创建一个视图来列出我还没有购买的所有产品吗?

【问题讨论】:

    标签: sql-server database tsql view


    【解决方案1】:

    是的,你可以 - t-sql 语法与任何其他跨数据库调用(例如在存储过程中)中的语法相同。

    要在第二个数据库中引用您的表,您只需要:

    [数据库名].[架构].[表名]

    所以你最终会得到类似的东西

    CREATE VIEW [dbo].[YourView]
    as
    select 
    a.ID, 
    a.SomeInfo, 
    b.SomeOtherInfo
    from TableInA a
    join DatabaseB.dbo.TableInB b
    on -- your join logic goes here
    

    请注意,这仅适用于同一台服务器 - 如果您的数据库位于不同的服务器上,您将需要创建一个链接服务器。

    【讨论】:

    • 让我试试..是的..我所有的数据库都在同一个服务器上。
    • 我想补充一点,我做了这样的事情。但需要注意的是,如果要指定创建视图的数据库名称,则不能使用CREATE VIEW abc.dbo.YourView。您必须改为运行USE abc,然后运行CREATE VIEW dbo.YourView,否则会出现错误。
    【解决方案2】:

    正如其他答案所示,您可以使用 {LINKED_SERVER.}DATABASE.SCHEMA.OBJECT 表示法。

    您还应该知道,默认情况下禁用跨数据库ownership chaining

    因此,在数据库中,在视图上授予 SELECT 允许可能在基础表上没有 SELECT 的用户仍然从视图中进行 SELECT。这可能不适用于用户对基础表没有权限的另一个数据库。

    【讨论】:

    • 是的。访问视图的 SQL 用户需要对任何引用的数据库具有读取权限。
    【解决方案3】:

    是的,视图可以引用三个部分命名的对象:

    create view A.dbo.viewname as
    select ... from A.dbo.ta as ta
    join B.dbo.tb as tb on ta.id = tb.id
    where ...
    

    由于备份/恢复一致性、引用完整性问题和可能的镜像故障转移,跨数据库查询会出现问题,但这些问题是跨数据库拆分数据所固有的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      • 2021-10-21
      • 2019-03-12
      • 1970-01-01
      • 2015-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多