Hurriyet

19 Kasım 2013 Salı

PL\SQL Örnekleri: Authid Nedir? - Ne İşe Yarar?

Authid ifadesi veritabanına  programın, procedure ya da function'ın hangi kullanıcının haklarıyla çalıştırılması gerektiğini söyler. Invoker's rights yani programı çalıştıran kişinin mi yoksa programı yaratan kişinin haklarının kullanılması büyük fark yaratır.

Programımızı yaratan kişi kullanan kişiden daha üstün olabilir. Bu durumda programı çalıştıran kişi daha az object üzerinde hakka sahip olduğu için programın içinde kullanılmış olabilecek herhangi bir object kullanma yetkisi yoksa hata alacaktır. Bunu engellemek ya da düzenlemek için Authid ifadesini kullanırız.

Authid ifadesini kullanabilmek için "Authid" ifadesini başlıktaki "IS" veya "AS" anahtar sözcüklerinden önce kullanmak gerekmektedir.

Seçenekler:

Authid definer: default olarak kullanılmaktadır. Yani normalde programı oluşturan kullanıcının hakları ile çalıştırılır.

Authid current_user: Programımızı yaratan değil de, şu an çalıştıran kullanıcının haklarıyla çalıştırır.

Avantajı Nedir?

Object'lerin çalıştırılması sırasında bu şekilde ayırt edilmesi bize ayrı bir katman yaratır, güvenlik sağlar. Bu şekilde birden fazla aynı object'i kullanabilir. Kod paylaşılırken erişilebilen object'ler(data) ayrı tutulabilinir. İstediğimiz object'i paylaşmak istediğimizde bu yapıyı, programın içine atarak erişebiliriz.

Özetle; datalar ayrı ama kodlar paylaşılırken bu yapı kullanılabilir. Ancak bu sayede data başka birisinin tablespace'indeyken erişim sağlanabilir.


Syntax?

Syntax olarak daha önce de belirttiğimiz gibi procedure veya fonksiyonlarda isimden sonra kullanılacak şekilde konulur ve "AS" ve "IS" yapılarından önce konulur.

Örneğin aşağıdaki yapılarda DBA rolüne sahip birisi olarak aşağıdaki prosedürü yaratıp DBA rolüne sahip olmayan birinin kullanımına AUTHID DEFINER olarak verirsek procedure  çalışacaktır. Halbuki AUTHID CURRENT_USER olarak verilirse procedure çalışmayacaktır; çünkü kullanıcı DBA rolüne sahip olmayacaktır.


 CREATE OR REPLACE PROCEDURE definer_test AUTHID DEFINER IS   
 BEGIN  
  FOR rec IN (SELECT table_name FROM dba_tables)  
  LOOP  
   dbms_output.put_line(rec.table_name);  
  END LOOP;  
 END definer_test;  
 /  
   
 CREATE OR REPLACE PROCEDURE cu_test AUTHID CURRENT_USER IS   
 BEGIN  
  FOR rec IN (SELECT table_name FROM dba_tables)  
  LOOP  
   dbms_output.put_line(rec.table_name);  
  END LOOP;  
 END cu_test;  
 / 

1 yorum: