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
  • 相关阅读:
    cs61b project1
    CS61b lab5
    leetcode DP
    Leetcode 还未解决的bug
    Git使用总结
    Mac TensorFlow Anaconda
    eclipse C++ ld: 1 duplicate symbol for architecture x86_64
    Leetcode Hashtable 1-5
    EC 601 PYTHONPATH
    EC 601 OpenCV Install
  • 原文地址:https://www.cnblogs.com/zhangshuaivole/p/13058970.html
Copyright © 2011-2022 走看看