代码之家  ›  专栏  ›  技术社区  ›  Loki

在具有只读访问权限的SQL Server上模拟视图的方法?

  •  0
  • Loki  · 技术社区  · 15 年前

    我正在尝试对一个只有只读访问权限的Microsoft SQL Server进行大量查询。我的查询需要处理与数据库体系结构非常不同的结构中的数据。因为我只有读取权限,所以无法创建视图,所以我正在寻找解决方案。 我可以看到两种解决方案,但我希望听到我可能错过的任何东西:

    还有其他想法吗?或者就这些想法提出建议?

    谢谢

    6 回复  |  直到 12 年前
        1
  •  2
  •   Raj More    15 年前

    以下是您的一些选择:

    设置复制以将数据移动到您自己的SQL Server,并在那里创建您需要的任何视图。管理员必须对此进行设置。如果需要在数据更改时查看数据,请使用事务复制。如果没有,您可以创建快照。

    请在此处阅读更多信息: http://technet.microsoft.com/en-us/library/ms151198.aspx

    专用数据 在与您的服务器相同的服务器上 为您提供写访问权限。在那里创建您的视图。

    您的视图创建可以如下所示:

    USE MyDB
    GO
    CREATE VIEW DBO.MyView 
    AS
    
    SELECT Column1, Column2, Column3, Column4
    FROM ProductionDB.dbo.TableName1 t1
        INNER JOIN ProductionDB.dbo.TableName2 t2
            ON t1.ColX = T2.ColX
    
    GO
    

    相同实例,不同服务器+不同实例: 我建议在与ProductionDB相同的SQL Server实例上创建MyDB,而不是安装新实例。就资源而言,一台计算机上的多个SQL Server实例比同一实例上的新数据库要昂贵得多。

    标准可重用视图

    创建一组标准化视图,并要求管理员将它们放在只读服务器上,然后在查询中重用这些视图

        2
  •  1
  •   ps.    15 年前

    您还可以使用CTE,其作用类似于视图。

    如果拉杰·莫尔的建议对你不起作用,我会支持的。。。

    WITH myusers (userid, username, password)
    AS
    (
       -- this is where the definition of view would go.
    select   userid, username, password from Users 
    
    )
    
    
    select * from myusers
    
        3
  •  0
  •   Damir Sudarevic    15 年前

    您可以要求DBA为像您这样的“承包商”创建一个模式,并允许您仅在该模式内创建对象。

        4
  •  0
  •   Ted Elliott    15 年前

    DECLARE @tempTable TABLE
    (
        col1 int,
        col2 varchar(250)
    )
    
    INSERT INTO @tempTable (col1, col2)
    SELECT a, b
    FROM SomeTable
    WHERE a < 100 ... /* some complex query */
    
    SELECT *
    FROM OtherTable o
    INNER JOIN @tempTable T
    ON o.col1 = T.col1
    WHERE ... 
    
        5
  •  0
  •   Mitchell Gilman    15 年前

    如果您有权访问其他SQL server,DBA可以创建一个“链接服务器”。然后,可以创建使用由四部分组成的名称访问数据的视图。例如,从OtherServer.OtherDB.dbo.Table中选择*

    在任何一种情况下,数据都是“活动的”,因此无需担心脏数据。

    这些视图将为您带来更清晰的代码和进行更改的单个位置,并从缓存的执行计划中获得几毫秒的性能优势。然而,不应该有巨大的性能飞跃。您提到了缓存,但据我所知,服务器没有做任何特定的操作 数据 缓存普通的、无索引的视图,这对于特殊查询是不可能的。

    如果您还没有这样做,您可能希望做一些实验,看看视图是否真的更快——制作一个数据库副本并将视图添加到那里。

    编辑:我今天做了一个类似的实验。我在Server1上有一个存储过程,它通过链接服务器从Server2获取数据。这是一个复杂的查询,连接了两台服务器上的许多表。我在Server2上创建了一个视图,该视图从该服务器获取了我需要的所有数据,并更新了proc(在Server1上),以便它使用该视图(通过链接服务器),然后将该视图加入到Server1上的一组表中。更新后速度明显加快。原因似乎是Server1没有估计它将从Server2获得的行数,因此构建了一个糟糕的计划。它在使用视图时做得更好。如果视图与它正在读取的数据在同一个数据库中,这并不重要,它必须在同一个服务器上(我只有实例,所以我不知道实例是如何发挥作用的)。

        6
  •  0
  •   treaschf    15 年前

    通过使用视图,查询的性能不会更好。您需要优化这些查询,并且可能应该对这些表建立一些索引,以支持您的查询。

    通过这种方式,您不会立即看到对原始数据库所做的更改(会有延迟),但您可以让查询执行得更快,如果您愿意,甚至可以创建这些视图。