zoukankan      html  css  js  c++  java
  • SQL ser 跨实例访问数据库

    SqlServer如何跨实例访问数据库

    Exec sp_droplinkedsrvlogin LinkName,Null
    Exec sp_dropserver LinkName
    go

    EXEC sp_addlinkedserver 'LinkName','','SQLOLEDB','192.168.1.102 2'

    EXEC sp_addlinkedsrvlogin 'LinkName'

    EXEC sp_addlinkedsrvlogin 'LinkName','false',NULL,'sa','uce'

    注释:

    我们日常使用SQL Server数据库时,经常遇到需要在实例Instance01中跨实例访问Instance02中的数据。例如在做数据迁移时,如下语句:

    insert into Instance01.DB01.dbo.Table01

              select * from Instance02.DB01.dbo.Table01

    普通情况下,这样做是不允许的,因为SQL Server默认不可以跨实例访问数据。解决方案是使用存储过程sp_addlinkedserver进行实例注册。

    sp_addlinkedserver在MSDN中的定义为:

    sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]     

          [ , [ @provider= ] 'provider_name' ]    

          [ , [ @datasrc= ] 'data_source' ]

          [ , [ @location= ] 'location' ]

          [ , [ @provstr= ] 'provider_string' ]

          [ , [ @catalog= ] 'catalog' ]

    例如:在Instance01实例中,执行如下SQL语句EXEC sp_addlinkedserver ‘Instance02’ //只写第一个参数即可,默认情况下,注册的是SQL Server数据库,其他参数用法详见MSDN。

    如果你的两个实例在同一个域中,且Instance01与Instance02有共同的域登陆帐号,那么经过上面的注册后,前面的insert语句就可以执行了。否则,还需要对注册的远程实例进行登陆帐号注册,在Instance01实例中,执行如下SQL语句

    EXEC sp_addlinkedsrvlogin 'InstanceName','true'  //使用集成认证访问远程实例

    或者 EXEC sp_addlinkedsrvlogin 'InstanceName','false','TJVictor,'sa','Password1' //使用Windows认证访问远程实例,当用户以TJVictor用户登陆Instance01实例访问Instance02时,默认把TJVictor映射成sa,且密码为Password1

    经过 sp_addlinkedserver实例注册和sp_addlinkedsrvlogin登陆帐户注册后,就可以在Instance01中直接访问Instance02中的数据库数据了。

    如果还无法访问,请检查本机DNS是否可以解析远程数据库的实例名。如果无法解析,可以在EXEC sp_addlinkedserver ‘Instance02’中把Instance02换为IP,或者在hosts文件中,自己建立相应DNS映射。

    下面列举几个跨实例数据库访问的存储过程和视图。

    存储过程名/视图名 作用 举例

    sp_addlinkedserver 注册远程数据库实例 exec sp_addlinkedserver ‘InstanceName’

    sp_dropserver 删除远程数据库实例 exec sp_dropserver ‘InstanceName’

    sp_addlinkedsrvlogin 注册远程实例登陆访问帐户 exec sp_addlinkedsrvlogin ‘InstanceName’, null

    sp_droplinkedsrvlogin 删除远程实例登陆访问帐户 EXEC sp_droplinkedsrvlogin 'InstanceName','UserName'

    sp_helpserver 当前实例已注册的可访问的实例(即查看使用sp_addlinkedserver已注册过的实例) sp_helpserver

    sys.sysservers 功能同sp_helpserver select * from sys.sysservers

    sys.linked_logins 查看已注册的登陆访问帐户(即查看使用sp_addlinkedsrvlogin已注册过的帐户) select * from sys.linked_logins

    sys.remote_logins 查看已注册的远端访问帐户 select * from sys.remote_logins

    1.access版本

    --建立连接服务器
    EXEC sp_addlinkedserver
    --要创建的链接服务器名称
    'ai',
    --产品名称
    'access',
    --OLE DB 字符
    'Microsoft.Jet.OLEDB.4.0',
    --数据源
    --格式:
    -- 盘符:路径文件名
    -- \网络名共享名文件名 (网络版本)
    'd: estdbdb.mdb'
    GO


    --创建链接服务器上远程登录之间的映射
    --链接服务器默认设置为用登陆的上下文进行
    --现在我们修改为连接链接服务器不需使用任何登录或密码
    exec sp_addlinkedsrvlogin 'ai','false'
    go


    --查询数据
    select * from ai...mytable
    go

    2.excel版本

    --建立连接服务器
    EXEC sp_addlinkedserver
    --要创建的链接服务器名称
    'ai_ex',
    --产品名称
    'ex',
    --OLE DB 字符
    'Microsoft.Jet.OLEDB.4.0',
    --数据源
    --格式:
    -- 盘符:路径文件名
    -- \网络名共享名文件名 (网络版本)
    'd: estdbmybook.xls' ,
    null,
    --OLE DB 提供程序特定的连接字符串
    'Excel 5.0'
    GO


    ----创建链接服务器上远程登录之间的映射
    --链接服务器默认设置为用登陆的上下文进行
    --现在我们修改为连接链接服务器不需使用任何登录或密码
    exec sp_addlinkedsrvlogin 'ai_ex','false'
    go


    --查询数据
    select * from ai_ex...sheet3$
    go


    3.ms sql版本

    --建立连接服务器
    EXEC sp_addlinkedserver
    --要创建的链接服务器名称
    'ai_mssql',
    --产品名称
    'ms',
    --OLE DB 字符
    'SQLOLEDB',
    --数据源
    '218.204.111.111,3342'
    GO


    --创建链接服务器上远程登录之间的映射
    EXEC sp_addlinkedsrvlogin
    'ai_mssql',
    'false',
    NULL,
    --远程服务器的登陆用户名
    'zhangzhe',
    --远程服务器的登陆密码
    'fish2231'
    go


    --查询数据
    select * from ai_mssql.pubs.dbo.jobs
    go


    --还有一个更简单的办法
    --这种方式在链接服务器建立后,它是默认开放RPC的

    --建立连接服务器
    EXEC sp_addlinkedserver
    --要创建的链接服务器名称
    --这里就用数据源作名称
    '218.204.111.111,3342',
    'SQL Server'
    GO


    --创建链接服务器上远程登录之间的映射
    EXEC sp_addlinkedsrvlogin
    '218.204.111.111,3342',
    'false',
    NULL,
    --远程服务器的登陆用户名
    'zhangzhe',
    --远程服务器的登陆密码
    'fish2231'
    go


    --查询数据
    select * from [218.204.253.131,3342].pubs.dbo.jobs
    go

    4.Oracle版本

    --建立连接服务器
    EXEC sp_addlinkedserver
    --要创建的链接服务器名称
    'o',
    --产品名称
    'Oracle',
    --OLE DB 字符
    'MSDAORA',
    --数据源
    'acc'
    GO


    --创建链接服务器上远程登录之间的映射
    EXEC sp_addlinkedsrvlogin
    'o',
    'false',
    NULL,
    --Oracle服务器的登陆用户名
    'F02M185',
    --Oracle服务器的登陆密码
    'f02m185185'
    go

    --查询数据
    --格式:LinkServer..Oracle用户名.表名
    --注意用大写,因为在Oracle的数据字典中为大写
    select * from o..F02M185.AI
    go

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Exec sp_droplinkedsrvlogin DBVIP,Null
    Exec sp_dropserver DBVIP

    EXEC sp_addlinkedserver
    @server='DBVIP',--被访问的服务器别名
    @srvproduct='',
    @provider='SQLOLEDB',
    @datasrc='Server2' --要访问的服务器


    EXEC sp_addlinkedsrvlogin
    'DBVIP', --被访问的服务器别名
    'false',
    NULL,
    'sa', --帐号
    'thankyoubobby' --密码


    Select * from DBVIP.pubs.dbo.orders


    /////////////////////////////ORACLE////////////////////////////
    Exec sp_droplinkedsrvlogin demo,Null
    Exec sp_dropserver demo
    go

    EXEC sp_addlinkedserver
    @server ='demo',
    @srvproduct='Oracle',
    @provider='MSDAORA',
    @datasrc='ServiceName'

    EXEC sp_addlinkedsrvlogin
    'demo',
    'false',
    NULL,
    'userid',
    'password'
    go

    SELECT * FROM OPENQUERY(demo ,'select * from tbdemo' )

    UPDATE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE id = 101')
    SET name = 'hello';

    INSERT OPENQUERY (demo, 'SELECT id FROM tbdemo')
    VALUES ('hello');

    DELETE OPENQUERY (demo, 'SELECT id FROM tbdemo WHERE name = ''hello''');

     

  • 相关阅读:
    商业智能领域需要了解的数据库优化理论
    动态监听与静态监听(转载)
    Oracle查看表结构的几种方法
    PLSQL Developer使用技巧整理
    Oracle数据库的三种验证机制
    EAV模型
    三门问题
    第一个python实例程序
    type()
    pi
  • 原文地址:https://www.cnblogs.com/aliangblog/p/3162071.html
Copyright © 2011-2022 走看看