воскресенье, 21 июля 2013 г.

DATABASE LINK

Получить метаданные о линке:

SELECT DBMS_METADATA.GET_DDL('DB_LINK',a.db_link,a.owner) || '/' FROM dba_db_links a


Создать линк:

CREATE DATABASE LINK "MY_LINK.SUN.COM"
   CONNECT TO "SCOTT" IDENTIFIED BY VALUES '054B287C5C9D0928639F28CC53F9D6D5043A07D0BE8325534D'
   USING 'TESTDB_REMOTEDB.MSK.SUN.COM'


Удалить линк:

SELECT   'DROP PUBLIC DATABASE LINK ' || object_name ||';'
FROM     SYS.dba_objects
where    object_type = 'DATABASE LINK'
and      owner = 'PUBLIC';


Просмотр информации о линках:

select * from dba_db_links;

select * from dba_objects  where object_type like '%DATABASE LINK%'

select * from sys.v_$dblink;


Проверяем что линк работает:

select * from dual@MY_LINK.SUN.COM;
select * from all_tables@MY_LINK.SUN.COM;
select * from  t1@MY_LINK.SUN.COM;



Работать с линками так:

select * from  t1@MY_LINK.SUN.COM;
rollback;
alter session close database link MY_LINK.SUN.COM;
select * from sys.v_$dblink;
select * from  t1@MY_LINK.SUN.COM;




database links (distributed transaction)



set lines 400
column origin format a45
column GTXID format a50
column LSESSION format a10
column USERNAME format a10
column status format a1
column waiting format a30

select /*+ ordered */ substr(s.ksusemnm,1,35)||'-'|| substr(s.ksusepid,1,35) origin,
substr(g.k2gtitid_ora,1,50) gtxid,
substr(s.indx,1,4)||'.'|| substr(s.ksuseser,1,5) lsession,
s.ksuudlna username,
substr(decode(bitand(ksuseidl,11), 1,'ACTIVE', 0, decode( bitand(ksuseflg,4096) , 0,'INACTIVE','CACHED'), 2,'SNIPED', 3,'SNIPED', 'KILLED'),1,1) status,
e.kslednam waiting
from x$k2gte g, x$ktcxb t, x$ksuse s, x$ksled e
where g.k2gtdxcb=t.ktcxbxba
and g.k2gtdses=t.ktcxbses
and s.addr=g.k2gtdses
and e.indx=s.ksuseopc;



ORIGIN = Machine-PID, машина, на которой работает клиентский инструмент

C eis-web.sun.ru process PID=1234 подключился к нашей базе (SPROM) под пользователем QRUSER


На SPROM

ORIGIN                                                                                                     GTXID             LSESSION         USERNAME    S     WAITING                       
----------------------------------------- ---------------------------------------------            -----------          ----------        -      ------------------------------
eis-web.sun.ru-1234                SPROM.b39bc3cb.23.4.3947425                19.45953           QRUSER          I      SQL*Net message from client   

На ARCH

ORIGIN                                                                                                      GTXID               LSESSION         USERNAME   S        WAITING                       
----------------------------------------- ---------------------------------------------             -------------      ----------       -        ------------------------------
base00dbadm01.domain.corp-88840      SPROM.b39bc3cb.23.4.3947425                1853.31078       ARCHIVE       I         SQL*Net message from client   

Далее порождённый процесс PID=88840 с базы (SPROM)  по dblink подключается к нашей базе (ARCH) под пользователем ARCH.
Причём GTXID (глобальный идентификатор транзакции), у них один (SPROM.b39bc3cb.23.4.3947425) и порождёна эта транзакция была в базе SPROM.

LSESSION  (Local Session),
это сеанс в вашей локальной базе данных (к которой вы подключены и запускаете этот скрипт)

S = статус LSESSION, он имеет 1 букву со следующим значением:

I (inactive)    
A (active)
C (cached)
S (sniped)
K (killed)

           
WAITING (чего ждет LSESSION)



(This SQL was posted to Metalink, now officially in Doc Note:104420.1.)





Метаданные Oracle


Метаданные DATABASE LINK:

SELECT DBMS_METADATA.GET_DDL('DB_LINK',a.db_link,a.owner) || '/' FROM dba_db_links a


Получить метаданные пользователя ANGOR:

set feedback off
set pagesize 25000
set linesize 1000
set long 90000
column script format a1000
set serveroutput on

variable v_username VARCHAR2(30);
exec :v_username := upper('angor');

--This line add a semicolon at the end of each statement
execute dbms_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SQLTERMINATOR',true);

-- This will generate the DDL for the user and add his objects,system and role grants
SELECT DBMS_METADATA.GET_DDL('USER',username) as script from DBA_USERS where username= :v_username
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT',grantee) as script from DBA_SYS_PRIVS where grantee= :v_username and rownum=1
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT',grantee) as script from DBA_ROLE_PRIVS where grantee= :v_username and rownum=1
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT',grantee) as script from DBA_TAB_PRIVS where grantee= :v_username and rownum=1;



clear screen
SET LONG 20000
SET LONGCHUNKSIZE 20000
SET PAGESIZE 0
SET LINESIZE 1000
SET FEEDBACK OFF
SET VERIFY OFF
SET TRIMSPOOL ON
column script format a1000
set serveroutput on

variable v_username VARCHAR2(30);
exec :v_username := upper('angor');

BEGIN
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'SQLTERMINATOR', true);
   DBMS_METADATA.set_transform_param (DBMS_METADATA.session_transform, 'PRETTY', true);
END;
/

SELECT dbms_metadata.get_ddl('USER', :v_username) as script FROM dual
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('SYSTEM_GRANT', :v_username) as script from dual
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('ROLE_GRANT', :v_username) as script from dual
UNION ALL
SELECT DBMS_METADATA.GET_GRANTED_DDL('OBJECT_GRANT', :v_username) as script from dual;

spool off



set long 20000
set longchunksize 20000
set pagesize 25000
set linesize 1000
set feedback off
set verify off
set trimspool on
column ddl format a1000

begin
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/

variable v_username VARCHAR2(30);
exec :v_username := upper('angor');

select dbms_metadata.get_ddl('USER', u.username) AS ddl
from   dba_users u
where  u.username = :v_username
union all
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
from   dba_ts_quotas tq
where  tq.username = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.grantee) AS ddl
from   dba_sys_privs sp
where  sp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.grantee) AS ddl
from   dba_tab_privs tp
where  tp.grantee = :v_username
and    rownum = 1
union all
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', rp.grantee) AS ddl
from   dba_role_privs rp
where  rp.grantee = :v_username
and    rp.default_role = 'YES'
and    rownum = 1
union all
select to_clob('/* Start profile creation script in case they are missing') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
union all
select dbms_metadata.get_ddl('PROFILE', u.profile) AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
union all
select to_clob('End profile creation script */') AS ddl
from   dba_users u
where  u.username = :v_username
and    u.profile <> 'DEFAULT'
and    rownum = 1
/