zoukankan      html  css  js  c++  java
  • SQL 2005 中查询或执行另外的数据库操作的方法

     摘要:
    如果,你想在一台数据库服务器上,查询另一个台数据服务器的数据该如何做呢?如果,你想在同一台数据服务器上,在不同的数据库之间查询数据,又该怎么办呢?

    1.Synonym

    2.openquery

    3.Linked Servers

         Server Object-->Linked Servers--> serverType 选择 SQL Server, 在 Security 中 选择"Be made using this security context"
    输入用户名和密码 ,使用:
    SELECT * FROM [Galaxy].DataWarehouse.dbo.Fact_Job_Statistics WHERE ...

    [转]数据库中使用 Synonym和openquery

    2007年10月23日 0:45:32 发布:yaosansi
    http://www.cnblogs.com/atomplus/archive/2009/04/28/1444988.html



    1, 什么是Synonym
    Synonym(同义词)是Sql 2005的新特性。推出已经好几年了。你可以简单的理解Synonym 为其他表的别名。我们使用Northwind数据库为例。比如,看下面的例子

    Create Synonym MyCustomers FOR Customers
    为Customers表创建一个Synonym,叫MyCustomers。 你可以把这个MyCustomers当作一个普通的表,可以对它进行查询,更新,删除和插入。比如
    查询: Select * from MyCustomers.
    插入:  Insert into MyCustomers  (CustomersID, CompanyName) values ('Tom', 'MS')
    所有的操作,和普通的表没有区别。

    2, Synonym的应用
    在你的程序发布的时候,你突然发现你需要更改某个表名,或字段名。而你的程序已经不可能修改。这时,怎么办呢?那就创建Synonym吧。当然,在 sql2000时代,你可以使用view来做这个事情,或sprocs或udf等。但Synonym有其它所不能的功能,那就是跨数据库,跨服务器。

    3,Synonym在同一服务器上的不同数据库
    对于同一服务器上的不同数据库,我们可以使用Synonym,将其他数据库中的表或view或sprocs及udf在本数据库中映射别名。这样,就可以不用更改连接字符串,而在当前对话数据库的情况下,获取其他数据库的数据,并对它进行,查询,更新,删除和插入工作。
    先假设已经存在Northwind数据库,然后,再建一个数据库。我们在新的数据库上,创建Customer表的Synonym.

    Create Synonym MyCustomers For Northiwind.dbo.Customers 
    需要注意的是,后面需要写清那个数据库,那个表,中间dbo为表的owner.
    然后,运行 Insert into MyCustomers  (CustomersID, CompanyName) values ('Tom', 'MS')
    和Select * from MyCustomers. 看看是不是真的像普通表那样。

    4, Synonym在不同服务器上的不同数据库
    假设,我们有一台数据库服务器叫SqlTest。上面有个数据库叫Northwind。我们本地还有一台数据库服务器。叫LocalTest. 其上面有一数据库叫Northwind或其他什么的。突然有一天,为了使本地的数据库跑的更快,本地的老数据被移到SqlTest上去了,本地只保存最近 更新的。那老数据总还是要用的,怎么样实现不同服务器之间的数据操作呢?那就用Synonym吧。如下

    Create Synonym MyCustomers For SqlTest.Northiwind.dbo.Customers 
    在上一个例子的基础上,加了个机器名字而已。就这么简单?不是吧?那台服务器还不一定知道用户名和密码呢。恩,是的,还要在本地服务器上,注册下远程的服务器。使用sp_addlinkedserver,次存储过程定义如下:

    sp_addlinkedserver [ @server = ] 'server'
        
    [ , [ @srvproduct = ] 'product_name' ]
        [ , [ @provider = ] 'provider_name' ]
        [ , [ @datasrc = ] 'data_source' ]
        [ , [ @location = ] 'location' ]
        [ , [ @provstr = ] 'provider_string' ]
        [ , [ @catalog = ] 'catalog' ]
    可以运行下面的脚本,将SqlTest注册到本地
    EXEC sp_addlinkedserver
       @server = 'SqlTest',
       @provider = 'MSDASQL',
       @provstr = 'DRIVER={SQL Server};SERVER=SqlTest;UID=sa;PWD=;'
    这样,就可以把远程数据库当成本地的来使用。

    5,Synonym的其他功能和用UI创建Synonym
    Synonym不光可以对表创建,也可以为view,sprocs,以及udf创建相应的Synonym. 如图:

    Sql2005的Server Managerment Studio有这么一项,选择后,会出现下面画面。添入名称等,选择object的类型,你就可以选为View,Table, Sprocs和udf创建Synonym了。


    6, openquery
    相对于Synonym,OpenQuery相对来说,功能就弱了点。其只是在调用其它数据库上的sprocs.比如

    select * from openquery([SqlTest]'exec northwind.dbo.[Customers By City] @param1=N''London'''where CustomerID = 'AROUT'


    这就是在执行SqlTest服务器上的,northwind数据库下的,[Customers By City]的存储过程。你可以在
    Linq To Sql进阶系列(五)Store Procedure篇 一文中,获得该存储过程。openquery其第一个参数为数据服务器的名称。如果是异地的,也需要在本地注册它,和Synonym相同。你也可以写本地 的机器名,那就成了本地跨数据库的操作了。在上面的这个例子中,其语句中有London,是传入存储过程的值。因为其已经被 ' 引过,在openquery函数下,又要被 ' 引。所以,它两头加了两个 ''。 如果有疑问,请参阅SQL 语句中特殊字符的处理及预防sql 注射

    7, Linq 对Synonym的支持
    目前SqlMetal和OR designer无法对Synonym做映射。但是,用户依然可以通过手工修改dbml 达到映射的目的。Synonym在Linq中的使用。和其他表等没有任何差别。

    结论:通过Synonym,我们可以实现不同数据库,以及不同服务器之间的数据分流。以达到平衡负载的目的,提高效率的目的。
  • 相关阅读:
    UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)
    Codeforces 482E ELCA (LCT)
    Codeforces 798D Mike and distribution (构造)
    AtCoder AGC017C Snuke and Spells
    HDU 6089 Rikka with Terrorist (线段树)
    HDU 6136 Death Podracing (堆)
    AtCoder AGC032D Rotation Sort (DP)
    jenkins+python+kubectl实现批量更新k8s镜像
    Linux 下载最新kubectl版本的命令:
    jenkins X 和k8s CI/CD
  • 原文地址:https://www.cnblogs.com/chinabc/p/1599162.html
Copyright © 2011-2022 走看看