zoukankan      html  css  js  c++  java
  • informix创建同义词

    搜索词条

    1、informix不同主机的数据库同义词创建?

    2、informix怎么实现跨服务器数据抽取?

    3、informix 数据库跨库访问的配置?https://blog.csdn.net/David_ifx/article/details/100133669

    4、informix配置互相访问的信任关系?https://blog.csdn.net/tonghudan/article/details/81502936

    一、同义词的介绍及应用背景

    背景

    为informix数据库中的表创建同义词

    事件描述:

    Informix数据库服务器dbserver有数据库db_a和数据库db_b,db_a是用户a创建的,db_b是用户b创建的, 由于使用db_a数据库的程序需要读取db_b数据库中的表,在这种情况下,连接到db_a的程序是不能访问db_b的数据的。所以想创建同义词让连接到 数据库db_a的程序也可以访问db_b中的表。(说明:此处的dbserver即为一个数据库服务器,且此处的数据库db_a与db_b均在dbserver的实例名下,否则,若为不同的数据库服务器,则需要先给数据库服务器建立信任关系)

    1.首先要明白什么是同义词

    A synonym is a word that has a similar meaning to another word.

    一个单词如果跟另外一个单词有相同的意思,那么这个单词是那个单词的同义词。在数据库中同义词是指一个数据库对象的别名、或者引用。

    2.可以为哪些对象创建同义词、及如何创建Informix数据库中可以为表(table)、序列(sequence)、视图(view)创建同义词,具体语法如下所示:

    另外,同一个数据库中可以存在多个带有相同名称的同义词,但这些同义词每一个都必须是属于不同用户,同一用户不能同时创建名称相同的专用(PRIVATE)或公用(PUBLIC)的同义词。

    创建过程:

    首先,b必须授权给a,让他能够访问需要的表:  grant selct on 表名 to "a" as "b";如果需要添加、更改或删除,则添加对应的grant insert/update/delete 等语句。然后,在a中创建那些表的同义词: create SYNONYM  b表名同义词  for  db_b:"b".b的表名;这样就可以在db_a中通过同义词访问db_b的表了。

    3.创建中可能碰到的问题

    568: Cannot reference an external database without logging.

    This statement refers to a database other than the current database. However, the current database uses transaction logging, and the external one does not. This action is not supported; the databases that are used in a single transaction must all use logging or all not use it.

    这个错误说明两个数据库的日志情况不一致,两个数据库要么都关闭日志功能,要么都启动日志功能。

    可以通过ontape -s -N 数据库名称 和ontape -s -U 数据库名称来关闭或启动日志功能,在做这个操作时,数据库必须不在应用中,如果有其他程序连接使用数据库,那么会出错。

    4.如何查看、删除

    用户对同义词以及该同义词引用的数据库对象具有相同的特权,syssynonyms、syssyntable、和systables系统目录表保存关于同义词的信息。

    使用 DROP SYNONYM 用户.同义词名  来删除同义词。

    实操:以A系统开发环境+B系统开发环境为例:

     

    --创建同义词
    create SYNONYM b表名同义词 for db_b:"表的创建用户".b的表名;
    --创建同义词
    create synonym syn_B_heyuejiekoubiao for Bredb:"p". heyuejiekoubiao;
    create synonym syn_B_linfenjiekoubiao for Bredb:"p". linfenjiekoubiao;
    create synonym syn_B_table3 for Bredb:"p". table3;
    create synonym syn_B_table4 for Bredb:"p". table4;
    create synonym syn_B_table5 for Bredb:table5;
    create synonym syn_B_table6 for Bredb:table6;
    --创建同义词
    create synonym syn_B_heyuejiekoubiao for Bredb: heyuejiekoubiao;
    create synonym syn_B_linfenjiekoubiao for Bredb:linfenjiekoubiao;
    create synonym syn_B_table3 for Bredb:table3;
    create synonym syn_B_table4 for Bredb: table4;
    create synonym syn_B_table5 for Bredb:table5;
    create synonym syn_B_table6 for Bredb:table6;
    --创建同义词:最全的创建方式:包含了数据库名、实例名、表的创建用户名。
    create synonym syn_B_prpdexch for Bredb@devids:"piccre". prpdexch;

    --删除同义词
    drop synonym syn_B_heyuejiekoubiao;
    drop synonym syn_B_linfenjiekoubiao;
    drop synonym syn_B_table3;
    drop synonym syn_B_table4;
    drop synonym syn_B_table5;
    drop synonym syn_B_table6;
    --查询数据

    查询本库的heyuejiekoubiao表
    select * from heyuejiekoubiao where paydate='2018-06-29';
    查询业务系统开发环境的数据(通过同义词)
    select * from syn_B_heyuejiekoubiao ;
    insert into heyuejiekoubiao select * from syn_heyuejiekoubiao where paydate='2018-06-29';
    直接查询业务系统开发环境的数据
    select * fromBredb@devids:"piccre".heyuejiekoubiao ;

    --注意 需要有该库的权限才可以通过同义词查询的到另一个库的数据。

    上述都是在同一台主机上创建的同义词。

    如果在两个不同机器之间建立同义词呢,则需要不同主机之间的数据库建立信任关系即可。

    下面是对配置互相访问信任关系的简单介绍,(我自己并没有用到)

    控制主机和用户访问信任关系的主要文件如下:
    
    /etc/hosts  --主机IP-主机hostname对应关系
    
    /etc/hosts.equiv --主机hostname-对应用户username对应关系
    
    /etc/services  --应用服务对应的端口
    
    /home/informix/etc/sqlhosts --连接文件。它规定数据库服务器的名称、连接的类型、主机的名称和服务名称
    
    /home/informix/etc/onconfig.* --informix数据库的配置文件,DBSERVERALIASES参数为配置的当前实例名,可配置多个(同样需要再services中配置与
    实例名一致的服务名)。 权限控制可参考如下图片:

    informix 数据库跨库访问的配置,要实现数据库的跨库访问,需要完成以下三步:

    1、修改/etc/hosts:

    ip地址   空格或TAB    主机名

    注:写上互相访问的两个主机的IP和主机名。

    示例:
    
    192.168.1.100       DB1
    
    192.168.1.200       DB2

     2、修改/etc/hosts.equiv(如果没有就创建):

     主机名   TAB     用户名

     注:为了省事两台主机都需要增加

     示例:
    
    DB1          informix
    
    DB2          informix

    3、修改$INFORMIXDIR/etc/sqlhosts(说明:此处需要切换到informix用户:sudo su - informix)

    可以通过 env|grep SQLHOSTS 来获得(我没使用这个命令)

    实例名      协议           IP       端口

    注:为了省事两台主机都需要增加

    示例:
    
    Dbserver1       onsoctcp        192.168.1.100    9099
    
    Dbserver2       onsoctcp        192.168.1.200    9099

    4、跨库访问示例:

     在Dbserver1上访问Dbserver2
    
    Select * from db2@Dbserver2:tabname;

    实操:下面以A系统开发环境与A系统测试环境 为例进行说明。

    环境:A开发环境数据库+A测试环境数据库;地址如下:

    如图,得到两台服务器的信息如下:

                IP            主机名  
    开发环境:10.129.202.58 DEV-DB
    测试环境:10.150.242.19 ZBGSZBJ

    主机名 用户名
    开发环境: DEV-DB reserve
    测试环境: ZBGSZBJ rbzzbj


    实例名 协议 IP 端口
    开发环境: devids onsoctcp 10.129.202.58 10001
    测试环境: zbj_ids onsoctcp 10.150.242.19 10001

    上述命令的操作均需要有root权限才能够操作。通过vi命令进行编辑即可。此处在实验时因为只有开发环境的root权限,所以只编辑了开发环境的上述配置,在测试环境数据库访问开发环境数据库中的表时,报错:尝试连接数据库服务器(devids)失败。

     以上报错说明不仅需要在被访问方(开发环境)进行信任关系配置,在访问方(测试环境)同样需要配置。

     可以确定的是,上述方式绝对是可以实现的,因为现在:A系统的生产环境与B系统的生产环境;A系统的测试环境与B系统的测试环境;A测试环境与C字典测试环境,它们的数据库都是在不同的机器上的。A系统均是通过创建同义词的方式来读取B系统的接口表数据的。

    说明:

    1、可以看到,上述配置通过IP,主机名,端口唯一确定了一个数据库系统,通过实例名唯一确定了该数据库系统的一个实例。

    2、在同一个数据库系统的同一个实例名下,如下图,A开发环境与B系统开发环境:只需要用户piccre赋予用户reserve权限(我直接赋予了dba权限),即可以通过创建同义词的方式,在A_dj库,访问B系统数据库中的表。

    创建同义词需要以下两步:
    1、赋予权限:
    grant dba to "reserve";
    2、创建同义词:
    create synonym syn_reins_prpdexch for reins_re@devids:"p". prpdexch;
    3、访问表:
    【1】直接访问:
    select count(*) from reins_re@devids:prpdexch;

    【2】通过同义词:select count(*) from syn_ywxt_prpdexch;

    4、删除同义词

    drop  synonym syn_ywxt_prpdexch ;
    需要注意的是:只要赋予了reserve用户权限,其实不需要创建同义词,就可以在reservedb_dj访问reinsredb中的表。 

    同理,当两台机器之间建立信任关系后,同样,无需创建同义词,即可以在A库,访问B库中的表。如A测试环境与B系统测试环境,地址如下图所示:

    从上图可以看到,A测试环境与B系统测试环境是在两台机器上。当建立信任后,同样可以直接访问。

    创建同义词需要以下三步:
    1、配置两个机器之间的信任关系。 2、赋予A测试库用户权限: grant dba to "rbzzbj"; 3、创建同义词: create synonym syn_re_prpdexch for reins_re@zb:"p". prpdexch; 3、访问表: 【1】直接访问: select count(*) from re_re@zb:prpdexch; 【2】通过同义词:select count(*) from syn_re_prpdexch; 4、删除同义词 drop synonym syn_re_prpdexch ;

    需要注意的是:只要赋予了reserve用户权限,其实不需要创建同义词,就可以在reservedb_dj访问reinsredb中的表。

     延伸

    1、数据库赋值权限与取消权限

    1、赋予权限:

    给informix用户赋予dba权限:grant dba to "informix";
    给rbzzbj用户赋予dba权限:grant dba to "piccre"; 

    给rbzzbj用户赋予连接权限:grant connect to "rbzzbj";

    grant select on "rbzzbj".t_plus1 to "public" as "zbj";

    grant update on "rbzzbj".t_plus2 to "public" as "zbj";

    grant insert on "rbzzbj".t_plus3 to "public" as "zbj";

    grant delete on "rbzzbj".t__plus4 to "public" as "zbj";

    grant index on "rbzzbj".t_plus5 to "public" as "zbj";

    2、移除权限

    Revoke connect from zbj;

    revoke all on "zbj".t_plus from "public" as "zbj";

     2、数据库相关

    数据库:

    数据库实例的含义:

    用户:

     3、Linux查看上查看及修改主机名

    hostname      查看主机名
    hostname -i: 查看本机对应的IP
    
    修改主机名
    vim /etc/sysconfig/network

    在这里插入图片描述

    vim /etc/hosts

    在这里插入图片描述

    修改完成后重启:reboot
  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/zhangshuaivole/p/13058970.html
Copyright © 2011-2022 走看看