PL/SQL “Accessible By” Sözdeyimi (12c New Features)

Herkese Selam,

Bu yazıda sizlere Oracle 12c ile gelen yeni bir özellikten bahsedicem umarım farkındalık anlamında faydalı bir yazı olur.

Oracle 12c ile beraber PL/SQL fonksyon ve prosedür kullanımlarını daha güvenli hale getirmek adına Oracle 12c sürümüne birtakım yeni özellikler ekledi. Bu söz deyimleri ile yazdığımız fonksyon ve prosedürlere erişimi DB seviyesinde daha güvenli hale getirebiliyoruz.

Oracle DB 12c R1’den önce db seviyesinde bir fonksyon veya prosedür çalıştırabilmenin ön koşulu bu prosedürü veya fonksyonu çağıracak db userının execute yetkisinin olması gerekliliğiydi. Bu koşul oluştuğunda ilgili user execute hakkı aldığı fonksyon veya prosedürleri çalıştırabilme hakkına sahipti. Teoride yeterince güvenli olarak görünen bu yöntem, DB ye erişen ve db üzerinde tüm haklara sahip API userlarının herşeyi yapabilme haklarına sahip olabilmelerinden dolayı bir açık oluşturmaktaydı. Bu durum yeni gelen özellik ile beraber bertaraf edilmiş diyebiliriz. Oracle 12c R1 de “Accessible By” söz deyimi ile korumak istediğimiz fonksyon veya prosedürleri yalnızca hangi fonksyon veya prosedürler tarafından çağırılabileceğini belirliyebiliyoruz. Bu şekilde kritik olarak belirleyeceğimiz fonksyon veya prosedürlerimizin bağımlıkllarını  ve güvenlik seviyesini arttırmış oluyoruz. Bu yöntem ile herhangi bir user’ın ilgili fonksyon veya prosedürü çalıştırabilmesi için yalnızca execute hakının olması yeterli olmamakta.

Şimdi Örnekler ile durumu inceleyelim.

CREATE PROCEDURE proc_accesible
ACCESSIBLE BY (invoker_proc)
AS
BEGIN
DBMS_OUTPUT.put_line('invoker comes');
END;

Şuan prosedürü başarılı bir şekilde yaratmayı başardık, burada dikkat edilmesi gerek konu accessible by ile belirttiğimiz invoker_proc isimli çağıran fonksyon veya prosedürümüzün henüz yaratılmamasına karşın kodumuzun hata almadan derlenmesidir. Burada Oracle compile time da herhangi bir kontrol yapmıyor bu yüzden otomatik olarak prosedürümüzü yaratıyor. Accesssible By ile belirttiğimiz çağırıcının ontrolünü Oracle run time da yapıyor.

Şimdi bir PL/SQL bloğu yazıp kodumuzu deneyelim.

BEGIN
proc_accesible ();
END;
ORA-06550: line 2, column 1:
PLS-00904: insufficient privilege to access object PROC_ACCESIBLE

Evet örnektende gördüğümüz üzere prosedürümüzü çağırmak için yazdığımız PL/SQL bloğu aynı user altında kodumuzu çalıştırmayı denediğimizde yetki hatası aldı.

Şimdi invoker prosedürümüzü yazıp birde çağırmayı öyle deneyelim.

CREATE PROCEDURE invoker_proc AS BEGIN proc_accesible (); END;

Şimdi bir PL/SQL bloğu yazıp kodumuzu deneyelim.
SET SERVEROUTPUT ON BEGIN invoker_proc (); END; anonymous block completed invoker comes

Evet sonuçtanda görüldüğü gibi erişim hakkı olan bir prosedür üzerinden yarattığımız prosedüre erişebildik.

Accessible By ile ilgili fonksyon veya prosedürü çağırabilecek metodu doğrudan ismini yazabileceğimiz gibi, başına çağıracak metodun tipini de belirtebiliriz. Bu durumda aynı schema altında bulunan ve adının aynı olabilme ihtimali olacak obje tipleri içinde (aynı schema da aynı ada sahip fonksyon, index veya constraint olabilir) bir kısıtlama getirerek erişim güvenliğini bir tık daha yukarı çekebiliriz. Aşağıdaki gibi bir kullanımla erişecek metodun hangi tip bir objeden geldiğinide kontrol edebiliriz.

 

ACCESSIBLE BY (TYPE invoker) — çalışabilemsi için adı invoker olan bir type’dan çağırılmalı.

ACCESSIBLE BY (PROCEDURE invoker) — çalışabilemsi için adı invoker olan bir procedure den çağırılmalı.


ACCESSIBLE BY (TRIGGER invoker); — çalışabilemsi için adı invoker olan bir triggerdan çağırılmalı.


ACCESSIBLE BY (PACKAGE invoker) — çalışabilemsi için adı invoker olan bir paketden çağırılmalı.


ACCESSIBLE BY (FUNCTION invoker) —  çalışabilemsi için adı invoker olan bir fonksyondan den çağırılmalı.

 

 

Umarım farkındalık anlamında faydalı bir yazı olmuştur.

Kaynaklar;

http://www.oracle.com/technetwork/issue-archive/2013/13-sep/o53plsql-1999801.html

http://docs.oracle.com/cd/E16655_01/server.121/e17906/chapter1.htm

 

 

 

 

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s