Başka Bir User Altındaki Private Linki Nasıl Drop-Create Edebiliriz

Sistemde farklı userlar altına private olan create edilmiş olan db linkleri kendi userımız ile drop etmek isterdiğimiz de alınan ORA-02024: database link not found hatasını nasıl çözebilirizi anlatıyor olacağım.

Simdi öncelikle private bir db link create edip, baska bir user ile drop etmeye çalistigimiz daki durumu sonrasinda da nasil çözebilecegimize bakalım.

Kamil userı ile sisteme connect olup bir private db link create ediyorum. Dblink içerisindeki bilgilerin doğruluğu şu aşama da bizim için çok önemli değil, link create ederken kullandığınız user, şifre, host gibi bilgiler yanlış olsa da linki başarılı olarak create edebilirsiniz. Sadece kullanmak istediğinizde ORA-12154: TNS:could not resolve the connect identifier specified hatasını alırsınız.

Private db linkimizi create etmekle başlayalım ;

kamil@ORATEST> create database link private_dblink
2 connect to user1
3 identified by user_pass
4 using ‘test’ ;
Database link created.

Private linkimiz hazır, şimdi kamil userı dışında herhangi bir user ile (ki biz sys ile deniyor olacaz) drop etmeyi deneyelim ;

sys@ORATEST> drop database link private_dblink ;
drop database link private_dblink
*
ERROR at line 1:
ORA-02024: database link not found

Db linkimiz privare olduğundan dolayı linki bulamadığı için ora-02024 hatasını aldık. Şimdi bu işlemi yapabilmek için gerekli olan CONNECT THROUGH yetkisini SYS userına vermeye çalışalım;

sys@ORATEST> ALTER USER sys GRANT CONNECT THROUGH kamil ;
ALTER USER sys GRANT CONNECT THROUGH kamil
*
ERROR at line 1:
ORA-28154: Proxy user may not act as client ‘SYS’

Bu işlemi SYS userı dışında bir user ile yapmamız gerektiğini söylüyor. Test1 userı ile drop etmeyi deniyelim, bunun için bu yetkiyi test1 userına vermeyi deneyelim ;

sys@ORATEST> ALTER USER kamil GRANT CONNECT THROUGH test1 ;
User altered.

Test1 userı ile sisteme aşağıdaki şekilde connect olalım ;

sys@ORATEST> conn test1/test1
Connected.

Artık private db linkimizi drop etmeyi deneyebiliriz ;

sys@ORATEST> CONNECT test1[kamil]/test1
Connected.
kamil@ORATEST>

kamil@ORATEST> drop database link private_dblink ;
Database link dropped.

Kamil userının şifresini bilmememize rağmen o user ile sisteme connect olabildik. Dolayısıyla bu aslında şu anlama geliyor şu anda Kamil userı altındaki tüm nesnelerin owner’ ıymışız gibi istediğimiz tüm işlemleri yapabiliriz. Bu yazıda bir başka bir user altında yer alan private dblinki nasıl drop edeceğimizden bahsettik ancak bu bilgiyle artık nasıl bir başka user altına private dblink oluşturabiliriz sorusuna da verilecek bir cevabımız var diyebiliriz.

Burda şu soru aklımıza gelebilir, peki bu yetki yokken biz başka bir user altına nasıl dblink oluşturyor veya nasıl drop edebiliyorduk. Bunun içinde aşağıdaki gibi çok basit bir procedure kullanarak sorunumuza çözüm üretebiliyorduk ;

test1@ORATEST> create or replace procedure kamil.create_private_dblink
2 is
3 begin
4 execute immediate ‘
5 create database link private_dblink3
6 connect to USER1
7 identified by test
8 using ” (DESCRIPTION =
9 (ADDRESS =
10 (PROTOCOL = TCP)
11 (HOST = test)
12 (PORT = 1521)
13 )
14 (CONNECT_DATA =
15 (SERVICE_NAME = testdb)
16 )
17 )”’;
18 end;
19 /
Procedure created.

Olulşturduğumuz bu proceduru test1 userı ile run ettiğimizde kamil scheması altına private_dblink3 isimli private db linkimiz oluşmuş olacaktır. Deneyelim ;

test1@ORATEST> begin
2 kamil.create_private_dblink;
3 end;
4 /
begin
*
ERROR at line 1:
ORA-01031: insufficient privileges
ORA-06512: at “KAMIL.CREATE_PRIVATE_DBLINK”, line 4
ORA-06512: at line 2

Hatası aldık, sebebi private dblink create etmeye çalıştığımız user’ ın create database link yetkisi olmadığından, gerekli yetkiyi verelim;

test1@ORATEST> grant create database link to kamil ;
Grant succeeded.

Tekrar proceduru run etmeyi deneyelim ;

test1@ORATEST> begin
2 kamil.create_private_dblink;
3 end;
4 /
PL/SQL procedure successfully completed.

Ve db linkimiz create oldu. Kontrol edelim;

test1@ORATEST> select owner, db_link from dba_db_links;

OWNER DB_LINK
———— ———————
KAMIL PRIVATE_DBLINK3

Son olarak private dblinkleri SYS userı ile drop etmek isterseniz eğer nette bulduğum basit ama bir o kadar da kullanışlı bir procedure var onu da paylaşmak istiyorum.

Aşağıdaki procedure yardımı ile istediğiniz user altındaki private db linkleri drop edebilirsiniz ;

Create or replace procedure Drop_DbLink(schemaName varchar2, dbLink varchar2 ) is
plsql varchar2(1000);
cur number;
uid number;
rc number;
begin
select
u.user_id into uid
from dba_users u
where u.username = schemaName;
plsql := ‘drop database link “‘||dbLink||'”‘;
cur := SYS.DBMS_SYS_SQL.open_cursor;
SYS.DBMS_SYS_SQL.parse_as_user(
c => cur,
statement => plsql,
language_flag => DBMS_SQL.native,
userID => uid
);
rc := SYS.DBMS_SYS_SQL.execute(cur);

SYS.DBMS_SYS_SQL.close_cursor(cur);
end;
/

Procedurumuz create ettikden sonra şu anki private db linkleri kontrol edip bi tanesini drop edelim ;

select db_link,owner from dba_db_links where owner=’KAMIL’

DB_LINK OWNER
PRIVATE_DBLINK KAMIL
PRIVATE_DBLINK2 KAMIL
PRIVATE_DBLINK4 KAMIL
PRIVATE_DBLINK5 KAMIL
PRIVATE_DBLINK6 KAMIL
PRIVATE_DBLINK7 KAMIL
PRIVATE_DBLINK3 KAMIL

Private_dblink isimli linki procedure yardımı ile drop edelim;

sys@ORATEST>exec Drop_DbLink( ‘KAMIL’, ‘PRIVATE_DBLINK’ );

sys@ORATEST>exec Drop_DbLink( ‘KAMIL’, ‘PRIVATE_DBLINK’ )
PL/SQL procedure successfully completed.

Procedurun kullanımı ile ilgili olarak daha detaylı bilgi için referans kısımında vermiş olduğum linke bakabilirsiniz.

Connect through yetkisi güvenlik açısından tehlike bir yetki olduğunu belirtmekle beraber zaman zaman şifresi unutulmuş veya kaybedilmiş olan userlar altındaki objeler üzerinde işlem yapmak gerektiğinde çokda faydası olan bir yetkidir.

Referans;
http://www.oracle-ckpt.com/drop-db_links-of-a-private-user-from-sys/

Be Sociable, Share!

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


+ 4 = oniki