728x90

안녕하세요. 바로 아래 글에서 인포믹스에서 정규식 패턴 변경 함수인 REGEX_REPLACE 를 테스트했습니다.

대신 REGEX_REPLACE 함수는 인포믹스 12버전에서만 지원되기에 질문자 분이 이하 버전에서 가능한 방법을 다시 질문하셨더군요.

마농님, 정상규님 댓글 감사합니다.

 

마농님이 올려주신 오라클에서의 쿼리는 적용이 되는데.

인포믹스에서는 12버전이 아니라 적용이 안되네요.

regex_replace 를 사용하지 않고 인포믹스에서도 가능할까요??


해당 쿼리를 다시 데이터베이스 사랑넷의 '마농'님께서 기본적인 문자열 함수를 사용해서 쿼리를 재작성하신 것으로 테스트해봤습니다.

오라클 기본적인 문자함수들로만 구성해 봤습니다.
인포믹스에 맞게 고쳐 보세요.

 

WITH t AS
(
SELECT '문자001' v FROM dual
UNION ALL SELECT '문자열01'    FROM dual
UNION ALL SELECT '01문자001'   FROM dual
UNION ALL SELECT '121문자열01' FROM dual
UNION ALL SELECT '문자002'     FROM dual
UNION ALL SELECT '문자003'     FROM dual
UNION ALL SELECT '문자1'       FROM dual
UNION ALL SELECT '문자'        FROM dual
UNION ALL SELECT '문자11A03'   FROM dual
)
SELECT v
     , SUBSTR(v, 1, x-y) || LPAD(SUBSTR(v, x-y+1, 4), 4, '0') z
  FROM (SELECT v
             , x
             , CASE WHEN SUBSTR(v, x-0, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-1, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-2, 1) BETWEEN '0' AND '9' THEN 1
             + CASE WHEN SUBSTR(v, x-3, 1) BETWEEN '0' AND '9' THEN 1
               ELSE 0 END ELSE 0 END ELSE 0 END ELSE 0 END AS y
          FROM (SELECT v, LENGTH(v) x FROM t) a
        ) a
;


인포믹스 11버전에서 그대로 사용해도 잘 수행되었습니다.

참고로 WITH문은 인포믹스에서 사용할 수 없습니다.

정말 멋지네요. 알려주신 '마농'님께 감사한 마음이 드는군요.



728x90
728x90

안녕하세요. 인포믹스에는 조건절에서 정규식을 사용해서 검색할 수 있는 MATCHES 키워드가 있습니다.

정규식으로 검색한 패턴을 변경하는 오라클의 REGEXP_REPLACE에 해당하는 함수는 12버전부터 지원합니다.

 

데이터베이스 사랑넷에서 패턴 변경에 대한 문의 내용을 발견하여 인포믹스 환경에서 테스트 해봤습니다.

아래는 질문하신 분이 올리신 글 내용입니다.

컬럼 데이터가

'문자001'

'문자열01'

'01문자001'

'121문자열01'

'문자002'

'문자003'

 

이런식으로... 복합접으로 들어가 있는 컬럼이 있는데요..

 

이것을

뒤에 001이라고 되어있는 숫자만.. 0001 로..자릿수를 맞춰야 합니다

 

그래서 결과가

'문자0001'

문자열0001'

01문자0001'

121문자열0001'

'문자0002'

'문자0003'

이렇게 뒷자리 숫자들이 공통적으로 4자리로 표현되어야 하는데요..

 

제생각으로는 문자랑 숫자(뒤쪽에 일련된 숫자)를 분리한후 뒤쪽 숫자를 0000으로 lpad해야 할거 같은데.

이게 오라클이랑 인포믹스에서 가능한가요??

출처 : 데이터베이스 사랑넷(http://database.sarang.net/?criteria=oracle&subcrit=qna&inc=read&aid=41526)

 

데이터베이스 사랑넷의 고수님인 '마농'님께서 답글로 아래 쿼리문을 올려주신 덕분에 쉽게 테스트 할 수 있었네요.

WITH t AS
(
SELECT '문자001' v FROM dual
UNION ALL SELECT '문자열01'    FROM dual
UNION ALL SELECT '01문자001'   FROM dual
UNION ALL SELECT '121문자열01' FROM dual
UNION ALL SELECT '문자002'     FROM dual
UNION ALL SELECT '문자003'     FROM dual
)
-- Oracle 정규식 --
SELECT v
     , REGEXP_REPLACE(REGEXP_REPLACE(v
       , '([0-9]+)$', '000\1')
       , '0+([0-9]{4})$', '\1')
       AS x
  FROM t
;

dbaccess에서 아래 내용을 수행해봤습니다. 수행 결과를 보기 좋게 하기 위해서 varchar(20)으로 형변환했습니다.

-- temp table 생성 및 데이터 입력 --
create temp table t (v varchar(20));
insert into t values ('문자001');
insert into t values ('문자열01');
insert into t values ('01문자001');
insert into t values ('121문자열01');
insert into t values ('문자002');
insert into t values ('문자003');
-- REGEX_REPLACE 함수 사용 결과 --
SELECT v::varchar(20)
       AS v
       , REGEX_REPLACE(REGEX_REPLACE(v
       , '([0-9]+)$', '000\1')
       , '0+([0-9]{4})$', '\1')::varchar(20)
       AS x
  FROM t
;
v                    x
문자001              문자0001
문자열01             문자열0001
01문자001            01문자0001
121문자열01          121문자열0001
문자002              문자0002
문자003              문자0003
6 row(s) retrieved.

 

REGEX_REPLACE는 인포믹스의 extension 기능으로 처음 호출할 때 해당 함수가 설치됩니다.

외장 함수의 형태로 생성되며, 설치되지 않은 상태에서 실행하면 자동으로 설치되는 것 같습니다.

인포믹스 메시지 로그와 데이터베이스 스키마에서 관련 내용을 확인 할 수 있습니다.

 

$ onstat -m

...

15:39:53  Logical Log 420 Complete, timestamp: 0xe75412.
15:40:09  INFO (autoregexe 13) (EXECUTE FUNCTION sysbldprepare ('ifxregex.*', 'create')) << 외장 함수가 설치되었음을 알림

 

$ dbschema -d kscdb -f all

...

create function "informix".regex_replace (lvarchar,lvarchar,lvarchar,integer default null,integer default null,integer default null)
returns lvarchar
with (parallelizable, handlesnulls, not variant, percall_cost=1000)
external name '$INFORMIXDIR/extend/ifxregex.1.00/ifxregex.bld(ifxregex_replace_char)' language c;

 

참고하셔서 사용하시면 유용할 것 같습니다.

 

 

관련자료

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_12.1.0/com.ibm.dbext.doc/ids_dbxt_559.htm

 

728x90
728x90

안녕하세요. 인포믹스 LOB(Large Object) 타입의 데이터 크기를 계산하는 방법을 테스트해봤습니다.

LOB 타입 데이터를 처리할 수 있는 함수가 없는 것으로 알고 있어서, 아래와 같이 blademgr의 번들된 모듈을 설치해서 사용했습니다.


1. 먼저 테스트용 데이터베이스 stores_demo를 아래와 같이 만듭니다.

$ dbaccessdemo -log -dbspace datadbs1


2. blademgr에서 LOB 타입 데이터를 처리하기 위한 모듈을 아래와 같이 설치합니다.

$ blademgr

ol_informix1210_1>show databases

Databases on server:

        stores_demo

        sysadmin

        sysuser


ol_informix1210_1>list stores_demo

DataBlade modules registered in database stores_demo:

         TimeSeries.6.00.FC7          ifxrltree.2.00

            spatial.8.22.FC2


ol_informix1210_1>show modules

16 DataBlade modules installed on server ol_informix1210_1:

                LLD.1.20.FC2                Node.2.0 c

           TSAFuncs.1.00.FC1       TSPIndex.1.00.FC1

           TSPMatch.2.00.FC1     TimeSeries.6.00.FC7

               binaryudt.1.0                bts.3.10

                excompat.1.0         ifxbuiltins.1.1

               ifxregex.1.00          ifxrltree.2.00

                 mqblade.2.0        spatial.8.22.FC2

                sts.2.00.FC1            wfs.1.00.FC1

A 'c' indicates DataBlade module has client files.

If a module does not show up, check the prepare log.

ol_informix1210_1>register excompat.1.0 stores_demo

Register module excompat.1.0 into database stores_demo? [Y/n]y

Registering DataBlade module... (may take a while).

DataBlade excompat.1.0 was successfully registered in database stores_demo.


3. 위와 같은 절차로 설치하고 나면 dbms 관련 함수와 프로시저가 생성된 것을 확인할 수 있습니다.

$ dbschema -d stores_demo -f all | egrep 'create function.*dbms_|create procedure.*dbms'

create function "informix".dbms_lob_getlength (blob)

create function "informix".dbms_lob_getlength (clob)

create function "informix".dbms_lob_compare (blob,blob,integer default 2147483647,integer default 1,integer default 1)

create function "informix".dbms_lob_substr (clob,integer default 32767,integer default 1)

create function "informix".dbms_lob_instr (clob,lvarchar,integer default 1,integer default 1)

create function "informix".dbms_lob_new_clob (lvarchar)

create function "informix".dbms_lob_compare (clob,clob,integer default 2147483647,integer default 1,integer default 1)

create function "informix".dbms_random_jrand48 (inout bigint)

create procedure "informix".dbms_output_enable (integer default 20000)

create procedure "informix".dbms_output_disable ()

create procedure "informix".dbms_output_put (lvarchar)

...


4. 인포믹스 데모 프로그램의 샘플 이미지 파일을 입력하기전에 사이즈를 확인합니다.

$ ls -l demo/esqlc/cn*.gif

-rw-r--r--    1 informix informix      15736 Apr 19 18:08 demo/esqlc/cn_10001.gif

-rw-r--r--    1 informix informix      21454 Apr 19 18:08 demo/esqlc/cn_10027.gif

-rw-r--r--    1 informix informix      11751 Apr 19 18:08 demo/esqlc/cn_10031.gif

-rw-r--r--    1 informix informix      25610 Apr 19 18:08 demo/esqlc/cn_10046.gif

-rw-r--r--    1 informix informix       7937 Apr 19 18:08 demo/esqlc/cn_10049.gif


5. 입력할 테이블을 만들고 LOB 데이터 크기를 계산합니다.

$ dbaccess stores_demo -

> create table test (filename varchar(30), img blob);

> insert into test values ('cn_10001.gif', filetoblob('./demo/esqlc/cn_10001.gif','client'));

> insert into test values ('cn_10027.gif', filetoblob('./demo/esqlc/cn_10027.gif','client'));

> insert into test values ('cn_10031.gif', filetoblob('./demo/esqlc/cn_10031.gif','client'));

> insert into test values ('cn_10046.gif', filetoblob('./demo/esqlc/cn_10046.gif','client'));

> insert into test values ('cn_10049.gif', filetoblob('./demo/esqlc/cn_10049.gif','client'));

> select filename, dbms_lob_getlength (img) from test;



filename                       (expression)


cn_10001.gif                          15736

cn_10027.gif                          21454

cn_10031.gif                          11751

cn_10046.gif                          25610

cn_10049.gif                           7937


5 row(s) retrieved.



Knowledge Center를 보면 DBMS_LOB_LENGTH라고 문서화가 되어있지 않아 혼동이 있을 것 같네요.

참고가 되시기를 바랍니다.




** 참고

http://www-01.ibm.com/support/docview.wss?uid=swg21670983

https://www.ibm.com/support/knowledgecenter/SSGU8G_12.1.0/com.ibm.dbext.doc/ids_r0055123.htm

728x90
728x90

인포믹스 11.50.xC7 이후 버전의 Growth Edition 부터 병렬처리 및 파티션 기능이 물리적으로 사용이 제한됩니다.

그러나 11.50.xC6 이하 버전에서는 Workgroup Edition이더라도 해당 기능들에 대한 물리적인 제한이 없었고 라이센스를 보유한 경우 사용에 제약이 없었습니다.
아래에는 위와 같은 경우의 인포믹스 버전을 업그레이드 했을때 해당기능들을 계속 사용할 수 있는 방법을 설명하고 있습니다.
IBM 라이센스 계약 없이 해당기능을 사용하는 것은, 계약 위반으로 비용적인 문제가 발생할 소지가 있습니다.

참고로 Growth Edition은 이전의 Workgroup Edition을 가리키는 용어이고, 버전에 따라 명칭이 다릅니다.
11.50.xC1 ~ 11.50.xC6  : Workgroup Edition
11.50.xC7 ~ 11.50.xC9  : Growth Edition
11.70.xC1 ~ 11.70.xC8  : Growth Edition
12.10.xC1 ~ 12.10.xC12 : Workgroup Edition

IBM Informix Dynamic Server, Version 11.50.xC7R1 contains the following new functionality:

Enabling parallelism and fragmentation in IBM Informix Growth Edition

Important: These features are limited to customers who were explicitly granted the rights to use them. Customers who have Informix Dynamic Server Workgroup Edition entitlements before February 10, 2009 have been grandfathered to use these features. See the IBM Withdrawal Announcement 909-049 for specific terms and conditions: http://www-01.ibm.com/common/ssi/rep_ca/9/897/ENUS909-049/ENUS909-049.PDF.

By default, the following parallelism and fragmentation features are not enabled:

  • parallel query
  • parallel index build
  • parallel load
  • parallel backup
  • parallel restore
  • parallel sort
  • high performance loader
  • table fragmentation
  • index fragmentation

If you are entitled to use these features, you can enable them. Add the GE_ALLOW_PARALLEL configuration parameter to your onconfig file and set the value for this configuration parameter to 1.


https://www.ibm.com/support/knowledgecenter/SSGU8G_11.50.0/com.ibm.relnotes.doc/ifx_1150xc7/ids_win_release_notes_11.50.html

728x90
728x90

오라클의 getxmltype 함수를 사용해서 테이블별 레코드수를 구하는 쿼리가 있더군요.

인포믹스에서도 가능한지 테스트를 해보았습니다.


우선 오라클에서 getxmltype 함수를 사용한 예제입니다


SELECT table_name

     , num_rows -- 통계정보 건수

     , TO_NUMBER(

       dbms_xmlgen.getxmltype('SELECT COUNT(*) c FROM ' || table_name).Extract('//text()')

       ) num_rows2 -- 실제측정 건수

  FROM user_tables

;


샘플 데이터인 SCOTT 계정에서 위와 같은 쿼리를 실행하면, 아래와 같은 결과를 보여줍니다.


TABLE_NAME                       NUM_ROWS  NUM_ROWS2

------------------------------ ---------- ----------

DEPT                                    4          4

EMP                                    14         14

BONUS                                   0          0

SALGRADE                                5          5

TB_DF_STAT                             24         24



인포믹스에서 XML 함수를 사용하려면 idsxmlvp 클래스의 Virtual Processor가 작동중이어야 합니다.

이는 onconfig의 VPCLASS 설정이나 onmode 명령으로 동적으로 설정할 수 있습니다.


인포믹스의 샘플 데이터베이스인 stores_demo 에서 xml함수를 활용해서 아래의 쿼리문장을 만들었습니다.

사용한 함수는 extractvalue, genxmlquery 입니다. 기본내장된 함수들입니다.


select tabname,

       nrows::int num_rows,

       extractvalue(genxmlquery('set','SELECT count(*) c FROM '||tabname),'/set/row/c')::int num_rows2 

from   systables where tabid > 99 and tabtype = 'T';



tabname     customer

num_rows    28

num_rows2   28


tabname     orders

num_rows    23

num_rows2   23


tabname     manufact

num_rows    9

num_rows2   9


tabname     stock

num_rows    74

num_rows2   74


tabname     items

num_rows    67

num_rows2   67


단일 쿼리로 건수를 검증할 수 있어 편리하네요. 용도에 맞게 사용하시면 좋을 것 같습니다.

대신 건수가 너무 많은 경우는 메모리나 디스크등 자원 소모량이 많아 시스템에 무리가 갈수도 있겠네요.

위와 같이 COUNT하는 용도외에도 활용할 수 있겠네요.


참조:

https://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.70.0/com.ibm.xml.doc/ids_xpconfig.htm

http://www.gurubee.net/article/55486

http://www.gurubee.net/article/61164

728x90
728x90

인포믹스에서는 listagg나 group_concat 같은 함수가 제공되지 않습니다.

프로시저나 함수같은 프로그램을 사용해야합니다.


아래는 인포믹스 11.5버전에서 실행해본 예제입니다.

AGGREGATE에 대한 자세한 설명은 아래의 페이지를 참고해보세요.


$ dbaccess stores_demo -

> CREATE FUNCTION gc_init...

> CREATE FUNCTION gc_iter...

> CREATE FUNCTION gc_comb...

> CREATE FUNCTION gc_fini...

> CREATE AGGREGATE group_concat...


CREATE FUNCTION gc_init(dummy VARCHAR(255)) RETURNING LVARCHAR;
    RETURN '';
END FUNCTION;
CREATE FUNCTION gc_iter(result LVARCHAR, value VARCHAR(255))
    RETURNING LVARCHAR;
    IF result = '' THEN
        RETURN TRIM(value);
    ELSE
        RETURN result || ',' || TRIM(value);
    END IF;
END FUNCTION;
CREATE FUNCTION gc_comb(partial1 LVARCHAR, partial2 LVARCHAR)
    RETURNING LVARCHAR;
    IF partial1 IS NULL OR partial1 = '' THEN
        RETURN partial2;
    ELIF partial2 IS NULL OR partial2 = '' THEN
        RETURN partial1;
    ELSE
        RETURN partial1 || ',' || partial2;
    END IF;
END FUNCTION;
CREATE FUNCTION gc_fini(final LVARCHAR) RETURNING LVARCHAR;
    RETURN final;
END FUNCTION;
CREATE AGGREGATE group_concat
    WITH (INIT = gc_init, ITER = gc_iter,
          COMBINE = gc_comb, FINAL = gc_fini);

> create table test (name varchar(20),nickname varchar(20));

 
Table created.
 
> insert into test values ('홍길동','구름');
 
1 row(s) inserted.
 
> insert into test values ('심청이','달');
 
1 row(s) inserted.
 
> insert into test values ('변사또','해');
 
1 row(s) inserted.
 
> insert into test values ('홍길동','달');
 
1 row(s) inserted.
 
> insert into test values ('심청이','별');
 
1 row(s) inserted.
 
> insert into test values ('변사또','물');
 
1 row(s) inserted.
 
 
> select name, group_concat(nickname) from test group by name;
 
 
 
name          홍길동
group_concat  구름,달
 
name          변사또
group_concat  해,물
 
name          심청이
group_concat  달,별
 
3 row(s) retrieved.



http://stackoverflow.com/questions/715350/show-a-one-to-many-relationship-as-2-columns-1-unique-row-id-comma-separate

http://www.ibm.com/support/knowledgecenter/en/SSGU8G_11.70.0/com.ibm.sqls.doc/ids_sqs_0358.htm


728x90
728x90

질문

MACH11환경에서, failover시 FAILOVER_CALLBACK 스크립트가 필요한 이유가 무었인가?


원인

때로는, Primary 엔진이 정상인데도 failover가 되는 경우가 있다, 이런경우에, 같은 디스크를 두서버가 access하게되면 문제가 발생한다. 이러한 경우를 막기 위하여 FAILOVER_CALLBACK 스크립트에 필요한 작업을 지정하여 줄수 있다.


응답

MACH11환경, 특히 SDS환경에서, failover되기 전에, Primary서버에서의 oninit process cleaning 또는 disk access에 대한 제한등에 대한 작업을 선행해야 한다.

아래의 작업들은, failover 시점에 꼭 확인해야할 사항이다 :


onconfig의 FAILOVER_CALLBACK 파라미터를 사용하여, failover시 Secondary가 primary또는 standard로 모드로 변경되기 직전 수행되어져야할 스크립트를 지정할수 있다.


일반적으로 이 스크립트는

1. 원래 primary의 모든 oninit 프로세서를 강제로 죽이는 작업

특히, AF 등의 발생으로 oninit process가 완전히 clear되지 않은 경우에 반드시, 관련 프로세스들을 모두 종료시키는 작업.



2. I/O Fencing 기능을 사용하여, 원래의 primary서버에서 더이상 디스크를 share하여 사용하지 못하도록 지정.



ISV 클러스터 관리 소프트웨어로 장애 복구

http://www.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.admin.doc/ids_admin_1168.htm


공유 파일 시스템에 대한 입출력 펜싱 구성

http://www.ibm.com/support/knowledgecenter/SSGU8G_11.70.0/com.ibm.admin.doc/ids_admin_1397.htm



일단 Secondary가 I/O fencing기능을 사용하여, primary/standard로 모드가 변경된 이후에, 원래의 primary를 복구하는 방법은 아래와 같이 진행될수 있다.


1. Primary서버와 관련된 네트워크 문제 해결

2. primary 서버로 로그인후, running중인 oninit 프로세스가 존재하는지 확인후, 존재한다면 강제로 해당 프로세스 종료시킴

3. disk sharing을 enable시킴 - 자세한 사항은 사용하고 있는 disk cluster s/w 기술참고.

4. 엔진을 기동시킴, 이때 secondary로 엔진이 기동됨.


결론적으로, AF 발생으로 primary서버가 on-line 모드가 아니거나, 네트워크 이상으로 primary 서버가 접근이 되지 않는 경우들에 유용하게 사용되어질수 있습니다.


http://www-01.ibm.com/support/docview.wss?uid=swg21631374

728x90
728x90

Question

How do you insert a newline / carriage return into a character field in dbaccess?

Cause

Sometimes there is the need to insert a newline / carriage return character into a character (varchar, lvarchar, etc.) column of a table to reflect a paragraph type format.

Answer

Within dbaccess or the ISQL menu, one could use the following steps to accomplish this:

create table t2 (c1 lvarchar);

insert into t2 values ('test'||chr(10)||chr(13)||'more test');

Selecting the data within dbaccess, one can see that the newline / carriage return is in the table by viewing the output format of the following select statement:

select * from t1;

c1 test
more test


1 row(s) retrieved.


http://www-01.ibm.com/support/docview.wss?uid=swg21686620

728x90
728x90

Question

How do you find outstanding in-place alters in a database

Answer

Download and run the attached script. It will find and display the tables with outstanding in-place alters in the database. Here is the command line syntax:

    inplacealter.ksh -d database_name -t [ALL| table_name ] [-o [ver|sum]]

    -d database      the name of the database (required) 
    -t [ALL|table]   the name of the table (default is all tables) 
    -o ver|sum       print either verbose or summary (default) report


The verbose report is similar to the oncheck -pT output. The summary output prints out whether the table has any outstanding in-place alters. The utility generates two output files: 
  • inplacealter.out -- in-place alter information
  • inplacealter.update -- SQL dummy update statements


The advantages of this script are: 
  • It places no locks on any tables, so it can be run anytime by the DBA
  • It doesn't run the expensive oncheck -pT to gather the statistics, so it is extremely fast even in the busiest of times on the server.
  • It creates a seperate script for the DBA with update statements for the table to remove the outstanding in-place alters. The update statement chooses a non-index column to be updated so that the engine does a sequential scan to select all pages used by the table.
  • It is written is Korn Shell and awk which are widely available on UNIX systems.

Warning: This script is not supported by Informix Technical Support. If it does not work on your system ask your system administrator for help debugging it. It is written in Korn Shell and may not work in other shells. The generated script containing the update statements can be run as-is; however, this script/updates have a direct impact on database logging and performance (time for the update(s) to complete). Serious consideration needs to be given to both these issues if any of tables referenced in the update statetments are logged and/or are very large.



http://www-01.ibm.com/support/docview.wss?rs=0&uid=swg21160923

728x90
728x90

IIUG Insider #190에 실린 기사입니다.

Gary Ben-Israel 씨의 참조 제약조건 정보를 나열하는 쿼리문장이 소개되어 있습니다.

참고하셔서 사용하실 수 있겠네요.


In this section I will write about things that help me in my day to day work.

Most DBAs probably have their own way to perform these tasks which may be different than the way I do them. So, if you find an error or can think of a better way, please let me know. If not feel free to use these tips as is or modify them to fit your needs.

Today's topic is a view my developers use when they want to find which tables are referencing the table they are dealing with. Some SQL editors can display this information but even when they do it is not always intuitive or easy.

In DBACCESS for instance it takes you six steps. At least that's what it takes me. Needless to say my developers are not familiar with DBACCESS and are not logged into an Informix server.

Performing this with a simple select statement can be helpful. We are using the following view:


create view back_ref_view
(referenced_table, referenced_column, referencing_table, referencing_column,
 cascading_delete, constraint_name, back_ref_view_ik) as
SELECT a.tabname
       d.colname,
       g.tabname,
       i.colname,
       CASE
         WHEN e.delrule = "C" THEN
              "Yes"
         ELSE
              "No"
         END cascaing_delete,
       f.constrname,
       f.constrid
FROM  systables a, sysconstraints b, sysindexes c, syscolumns d,
      sysreferences e, sysconstraints f, systables g, sysindexes h,
      syscolumns i
WHERE b.tabid = a.tabid
  AND b.constrtype = "P"
  AND c.idxname = b.idxname
  AND d.tabid = c.tabid
  AND d.colno = c.part1
  AND e.primary = b.constrid
  AND f.constrid = e.constrid
  AND g.tabid = f.tabid
  AND h.idxname = f.idxname
  AND i.tabid = h.tabid
  AND i.colno = h.part1;
grant select on back_ref_view to "public";


Gary Ben-Israel


http://www.iiug.org/Insider/insider_apr16.php#W4M


728x90

+ Recent posts