SOLID Prensipler


Yazılımcılar, yazılım geliştirirken küçük ölçekli projelerde ve tek yazılımcı ile yürütülen süreçlerde genelde kendi kuralları ile yazılım geliştirirler. Bu kurallar da genelde nasıl başlarsan öyle gider mantığında ilerlemektedir. Fakat projenin büyüdüğü noktalarda veya ekibe yeni yazılımcılar katıldığında işler biraz daha karmaşık hal almaktadır. Bu süreci yönetebilmek için hemen hemen her meslekte olduğu gibi belli standartlar çerçevesinde yazılım geliştirmek hem hata yapmayı engeller hem de kod incelemelerinde kolaylıklar sağlar.

Bu kapsamda dünya üzerinde genel geçer kabul edilen yazılım geliştirme prensipleri mevcuttur. Bu prensiplerden birisi de SOLID prensipleridir.

SOLID bir isim değil bir kısaltmadır. Yukarıdaki görselde adımları ingilizce olarak belirtilmiştir. Şimdi konuyu biraz daha detaylandırarak 5 ana başlık halinde inceleyelim.

Single Responsibility Principle

Bu kuralın amacı uygulama geliştirme aşamalarında herhangi bir değişiklik yapılmak istendiğinde buna bağlı olarak nelerin etkileneceği düşüncesinden kurtulmak ve isteğimiz geliştirmeyi yapabilmemize olanak sağlamaktır. Her bir metot veya fonksiyon sadece kendisine verilen işi yapar aynı anda birden fazla modeli etkileyemez, örnek vermek gerekirse bir dizi işi yapan bir fonksiyon yazmaktansa tüm gereksinimleri parçalara ayırıp bağımsız fonksiyonlar ile yapmayı gerektiren bir kuraldır. Böylece zaman içerisinde geliştirme yaparken etkilenecek diğer aşamaları gözden kaçırmanız gibi bir risk oluşmaz.

Open/Closed Principle

Bu kuralın amacı projemizdeki nesnelerin geliştirmeye açık ama değişime kapalı olmaları anlamına gelmektedir. Oluşturduğunuz nesneler zaman içerisinde ek özellikler kazanabilir genişlemeye açık olurlar bu normal bir yazılım projesinde kaçınılmaz bir durumdur. Ama temel nesne değişime kapalı tutulmalıdır.

Liskov’s Substitution Principle

Bu kuralın amacı kalıtım (inheritance) alarak türeyen sınıfların kalıtım aldıkları nesnenin tüm özellikleri kullanmalı ve sonrasında kendi özelliklerini barındırmasını hedefleyen bir prensiptir. (Kalıtım hakkında bilginiz yoksa buraya tıklayınız.) eğer nesne kalıtım aldığı nesnenin tüm özelliklerini kullanmaz ise ortaya gereksiz kod yığınları oluşur ve sonrasında kalıtım alınan nesnenin diğerlerinden ayrılması için koşul bloklarına (if) ihtiyaç olur ve bu durum son derece verimsiz bir yazılıma sebep olur.

Interface Segregation Principle

Bu kural bir arayüze gerektiğinden fazla yetenek eklenmemesi gerektiğini söyler. Nesnelerin ihtiyaç duymadıkları fonksiyonların Interface’lerinden mümkün olduğunca ayrıştırılmasıdır.

Dependency Inversion Principle

Bu kurala göre ise üst seviye sınıflar, modüller, fonksiyonlar alt seviyeli sınıflara bağımlı olmamalıdır. Alt sınıflarda yapılan değişiklikler üst sınıfları etkilememelidir. Yüksek seviyeli sınıflar, düşük seviyeli sınıflara bağlı olmamalı, her ikisi de soyut kavramlara bağlı olmalıdır.

Software Development Principles, Yazılım Geliştirme Prensipleri içinde yayınlandı | , , , , , , , , , , , ile etiketlendi | Yorum bırakın

C#’ta Const, Readonly ve Static Anahtar Kelimeleri Arasındaki Farklar


Const ve readonly anahtar sözcüğü, bir alanı sabit hale getirmek için kullanılır; bu değer değiştirilemez. Static anahtar kelimesi, üyelerin tüm sınıf nesneleri tarafından paylaşılabilecek static olmalarını sağlamak için kullanılır. Bu yazıda, bu üç arasındaki farkı anlayacağız.

Şimdi C#’daki const, readonly ve static değişkenler arasındaki farkın ne olduğunu ve bu anahtar kelimelerin her birini ne zaman kullanmamız gerektiğini öğrenelim.

Constant

Constant alanlara veya local (yerel) değişkenlere bildirim sırasında bir değer atanmalıdır ve bundan sonra değerleri değiştirilemezler. Varsayılan olarak Constant’lar static’tir, dolayısıyla Constant bir tipi static olarak tanımlayamazsınız.

Const (uzunca okunuşu: constant) olarak bildirilen bir değişkene bildirimde (tanımlama anında) bir değer atanmalıdır ve bu değer daha sonra değiştirilemez.

public const string ConnectionString = "YourConnectionString";

Bir const değişkenindeki değer, “compile-time (derleme zamanı)” değeri olarak adlandırılan değerdir ve değişmezdir (program ömrü boyunca değişmez).

Yalnızca primitive (ilkel) veya built-in (yerleşik) C# tiplerinin (örneğin, int, string, double) const ilan edilmesine izin verilir. Bu nedenle, aşağıdakilerden herhangi birini yazamazsınız:

public const DateTime DateOfFoundation = new DateTime(1923,10,29);
public const MyClass MyValue = new Class() {Name = "TestName"};

Uygulamanız kullanılırken değeri hiç değişmeyecek bir değişkeniniz olduğunda const kullanmak istersiniz. Ayrıca, const olarak bildirilen herhangi bir değişken, dolaylı olarak static olarak da bildirilecektir.

Bir const alanı compile-time (derleme zamanı) sabiti olduğunu söyledik. Sabit bir alan veya yerel değişken derleme zamanında tamamen değerlendirilmesi gereken sabit bir ifade ile başlatılabilir.

void Hesapla(int Z)
{
   const int X = 10, X1 = 50;
   const int Y = X + X1; //hata yok, derleme zamanı (compile time) değerlendirildiğinden
   const int Y1 = X + Z; //çalışma zamanında (run time) değerlendirildiğinde hata verir
}

Const anahtar sözcüğünü yerleşik değer türlerine (yani built-in value types) (byte, short, int, long, char, float, double, decimal, bool), enum, bir dize değişkeni (string literal) veya null ile atanabilecek bir reference türüne uygulayabilirsiniz.

const BenimSinifim obj1 = null; //hata yok, derleme zamanı değerlendirildiğinden
const BenimSinifim obj2 = new BenimSinifim(); //çalışma zamanında değerlendirildiğinden hata verir

Const’lar public, private, protected, internal veya protected internal erişim değiştiricileri (access modifiers) olarak işaretlenebilir.

Bir alanın veya yerel (local) değişkenin değerinin değişmeyeceğinden emin olduğunuzda const değiştiricisini kullanın.

Readonly (Salt Okunur)

Readonly bir alan, bildirim sırasında veya aynı sınıfın yapıcısı içinde başlatılabilir. Bu nedenle, readonly alanlar run-time (çalışma zamanı) sabitleri için kullanılabilir. Readonly bir alan, bu alana atanmanın yalnızca sınıfın bildiriminin bir parçası olarak veya bir kurucuda gerçekleşebileceği alandır.

class BenimSinifim
{
   readonly int X = 10; // beyan edildiği sırada değeri atanan sabit
   readonly int X1;

   public BenimSinifim(int x1)
   {
      X1 = x1; // çalışma zamanında değeri atanır
   }
}

Başka bir örnek;

public class TestClass
{
public readonly string ConnectionString = "TestConnection";

public TestClass()
{
ConnectionString = "DifferentConnection";
}

public void TestMethod ()
{
ConnectionString = "NewConnection"; //Derlenmeyecektir
}
}

Bu, readonly (salt okunur) bir değişkenin aynı sınıftaki farklı kurucular için farklı değerlere sahip olabileceği anlamına gelir.

Açıkça (explicitly), readonly alanını static olarak belirleyebilirsiniz çünkü readonly alanlar const gibi varsayılan olarak static değildir.

ReadOnly anahtar kelimesi, değer (value) türüne ve referans (reference) türüne uygulanabilir.

Çalışma zamanında (run time) bir alanı sabitlemek istediğinizde readonly değiştiriciyi kullanın.

Sonuç olarak; Const compile time sabitidir, ReadOnly run time sabitidir.

Diagram-Readonly-Vs-Constant

Static

Static anahtar kelimesi, spesifik bir üyeyi static olarak belirtmek için kullanılır; bu, static üyelerin tüm nesneler için ortak olduğu ve belirli bir nesneye bağlanmadıkları anlamına gelir. Bu anahtar kelime sınıflar (class), alanlar (fields), yöntemler (methods), özellikler (properties), operatörler (operators), olaylar (events) ve yapıcılar (constructors) ile kullanılabilir, ancak dizin oluşturucular (indexers), yıkıcılar (destructors) veya sınıf dışındaki türlerle kullanılamaz.

class BenimSinifim
{
   static int X = 10;
   int Y = 20;
   public static void Goster()
   {
      Console.WriteLine(X);
      Console.WriteLine(Y); //Yalnızca statik üyelere erişebileceğinizden bu erişim hatalıdır
   }
}

Statik anahtar kelimesi ile ilgili önemli noktalar:

  • Static anahtar sözcüğü bir sınıfa uygulanırsa, sınıfın tüm üyeleri static olmalıdır.
  • Static yöntemler (methods) yalnızca aynı sınıfın static üyelerine erişebilir. Static özellikler (properties), bir sınıfın static alanlarının değerini almak veya ayarlamak için kullanılır.
  • Static bir kurucu method (constructor) parametreleştirilemez. Erişim düzenleyicileri Static yapıcıya (static constructor) uygulanamaz, her zaman sınıfın static alanlarını başlatmak için kullanılan genel bir varsayılan yapıcıdır.

Özetle;

Const, static ve readonly kullanma hakkında bilmeniz gerekenler:

  1. Değerin hiçbir zaman, hiçbir zaman, hiç bir zaman değişmeyeceğini biliyorsanız, const kullanın.
  2. Değerin değişip değişmeyeceğinden emin değilseniz, ancak diğer sınıfların veya kodun onu değiştirmesini istemiyorsanız, readonly kullanın.
  3. Bir türün özelliği olması için bir alana ihtiyacınız varsa ve o türün bir örneğinin özelliği olmadığında static kullanın.
  4. Bir const değeri de dolaylı olarak static’tir.

Mutlu Kodlamalar dilerim!

C# içinde yayınlandı | , , ile etiketlendi | Yorum bırakın

SYS_CONTEXT ve USERENV


Merhaba arkadaşlar, bu makalemizde Oracle PL/SQL fonksiyonlarından SYS_CONTEXT fonksiyonunun ne işe yaradığı ve nasıl kullanıldığı ile ilgili kısa bir bilgi vereceğim.

Oracle PL/SQL SYS_CONTEXT fonksiyonu Oracle ortamı hakkında bilgi almak için kullanılır. Genel itibariyle loglama yaptığınız sistemlerde kullanımı oldukça yaygındır. Özel olarak trigger (tetikleyici) yapılarında da kullanılabilmektedir. Örneğin oturumdaki kullanıcının bilgilerini almak isteyebilir, hangi veri tabanı üzerinde çalışıldığı bilgisini elde edebilir, server (sunucu) bilgilerini geri döndürebilirsiniz. Genel olarak ortam bilgilerini oturum bazında kullanmak istediğinizde çok işinize yarayabilir. Elde edeceğiniz bilgileri yapılan işlemler bazında logunu tutabilirsiniz. Diğer taraftan oturumda kullanılan database bilgisine göre değişken yapılar oluşturabilirsiniz. Mesela test ve production (üretim) ortamlarında farklı davranışlar sergilemek istediğiniz durumlarda bunu USERENV namespace’inin DB_NAME özniteliği yapabilirsiniz.

Oracle PL/SQL SYS_CONTEXT fonksiyonu için sözdizimi aşağıdaki gibidir:

SYS_CONTEXT( namespace, parameter [, length] )

Buradaki parametre ve değişken yapısından bahsedeyim;

namespace
Parametre adı herhangi bir string ifade olabilir. Oracle tarafından oluşturulan “USERENV” deyimi kullanıldığında bu deyim vasıtasıyla geçerli Oracle oturumundaki özniteliklerin açıklaması döndürülür. Büyük/Küçük harf duyarlılığı yoktur. Uzunluğu 30 byte ile sınırlıdır.
parameter
DBMS_SESSION.set_context procedure’ü kullanılarak geçerli nitelikler ayarlanır.
length
İsteğe bağlı bir alandır. Byte cinsinden değerin uzunluğu verilir. Eğer bu parametre boş bırakılırsa ya da geçersiz bir değer girilirse sys_context fonksiyonu için bu değer varsayılan olarak 256 byte (maximum değer) olarak ayarlanacaktır. Bu alan için geçerli aralık 1 ile 4000 byte aralığındadır.

SYS_CONTEXT fonksiyonu ORACLE PL/SQL’in Oracle 12c, Oracle 11g, Oracle 10g, Oracle 9i, Oracle 8i sürümlerinde kullanılabilir.

Aşağıdaki örnekleri kullanarak SYS_CONTEXT fonksiyonunun sonuçlarını keşfedebilirsiniz.

SELECT sys_context('userenv','ACTION') FROM DUAL;
SELECT sys_context('userenv','AUDITED_CURSORID') FROM DUAL;
SELECT sys_context('userenv','AUTHENTICATED_IDENTITY') FROM DUAL;
SELECT sys_context('userenv','AUTHENTICATION_DATA') FROM DUAL;
SELECT sys_context('userenv','AUTHENTICATION_METHOD') FROM DUAL;
SELECT sys_context('userenv','BG_JOB_ID') FROM DUAL;
SELECT sys_context('userenv','CLIENT_IDENTIFIER') FROM DUAL;
SELECT sys_context('userenv','CLIENT_INFO') FROM DUAL;
SELECT sys_context('userenv','CURRENT_BIND') FROM DUAL;
SELECT sys_context('userenv','CURRENT_EDITION_ID') FROM DUAL;
SELECT sys_context('userenv','CURRENT_EDITION_NAME') FROM DUAL;
SELECT sys_context('userenv','CURRENT_SCHEMA') FROM DUAL;
SELECT sys_context('userenv','CURRENT_SCHEMAID') FROM DUAL;
SELECT sys_context('userenv','CURRENT_SQL') FROM DUAL;
SELECT sys_context('userenv','CURRENT_SQLn') FROM DUAL;
SELECT sys_context('userenv','CURRENT_SQL_LENGTH') FROM DUAL;
SELECT sys_context('userenv','CURRENT_USER') FROM DUAL;
SELECT sys_context('userenv','CURRENT_USERID') FROM DUAL;
SELECT sys_context('userenv','DATABASE_ROLE') FROM DUAL;
SELECT sys_context('userenv','DB_DOMAIN') FROM DUAL;
SELECT sys_context('userenv','DB_NAME') FROM DUAL;
SELECT sys_context('userenv','DB_UNIQUE_NAME') FROM DUAL;
SELECT sys_context('userenv','DBLINK_INFO') FROM DUAL;
SELECT sys_context('userenv','ENTRYID') FROM DUAL;
SELECT sys_context('userenv','ENTERPRISE_IDENTITY') FROM DUAL;
SELECT sys_context('userenv','FG_JOB_ID') FROM DUAL;
SELECT sys_context('userenv','GLOBAL_CONTEXT_MEMORY') FROM DUAL;
SELECT sys_context('userenv','GLOBAL_UID') FROM DUAL;
SELECT sys_context('userenv','HOST') FROM DUAL;
SELECT sys_context('userenv','IDENTIFICATION_TYPE') FROM DUAL;
SELECT sys_context('userenv','INSTANCE') FROM DUAL;
SELECT sys_context('userenv','INSTANCE_NAME') FROM DUAL;
SELECT sys_context('userenv','IP_ADDRESS') FROM DUAL;
SELECT sys_context('userenv','ISDBA') FROM DUAL;
SELECT sys_context('userenv','LANG') FROM DUAL;
SELECT sys_context('userenv','LANGUAGE') FROM DUAL;
SELECT sys_context('userenv','MODULE') FROM DUAL;
SELECT sys_context('userenv','NETWORK_PROTOCOL') FROM DUAL;
SELECT sys_context('userenv','NLS_CALENDAR') FROM DUAL;
SELECT sys_context('userenv','NLS_CURRENCY') FROM DUAL;
SELECT sys_context('userenv','NLS_DATE_FORMAT') FROM DUAL;
SELECT sys_context('userenv','NLS_DATE_LANGUAGE') FROM DUAL;
SELECT sys_context('userenv','NLS_SORT') FROM DUAL;
SELECT sys_context('userenv','NLS_TERRITORY') FROM DUAL;
SELECT sys_context('userenv','OS_USER') FROM DUAL;
SELECT sys_context('userenv','POLICY_INVOKER') FROM DUAL;
SELECT sys_context('userenv','PROXY_ENTERPRISE_IDENTITY') FROM DUAL;
SELECT sys_context('userenv','PROXY_USER') FROM DUAL;
SELECT sys_context('userenv','PROXY_USERID') FROM DUAL;
SELECT sys_context('userenv','SERVER_HOST') FROM DUAL;
SELECT sys_context('userenv','SERVICE_NAME') FROM DUAL;
SELECT sys_context('userenv','SESSION_EDITION_ID') FROM DUAL;
SELECT sys_context('userenv','SESSION_EDITION_NAME') FROM DUAL;
SELECT sys_context('userenv','SESSION_USER') FROM DUAL;
SELECT sys_context('userenv','SESSION_USERID') FROM DUAL;
SELECT sys_context('userenv','SESSIONID') FROM DUAL;
SELECT sys_context('userenv','SID') FROM DUAL;
SELECT sys_context('userenv','STATEMENTID') FROM DUAL;
SELECT sys_context('userenv','TERMINAL') FROM DUAL;

USERENV namespace’inin kullanıldığı geçerli parametre değerleri aşağıdaki gibidir, fakat unutulmamalıdır ki, bu parametrelerden bazıları tüm Oracle versiyonlarında kullanılmayabilir:

Parameter Explanation Oracle9i Oracle10g Oracle11g
AUDITED_CURSORID Returns the cursor ID of the SQL that triggered the audit Yes Yes Yes
AUTHENTICATED_IDENTITY Returns the identity used in authentication No Yes Yes
AUTHENTICATION_DATA Authentication data Yes Yes Yes
AUTHENTICATION_METHOD Returns the method of authentication No Yes Yes
AUTHENTICATION_TYPE Describes how the user was authenticated. Can be one of the following values: Database, OS, Network, or Proxy Yes No No
BG_JOB_ID If the session was established by an Oracle background process, this parameter will return the Job ID. Otherwise, it will return NULL. Yes Yes Yes
CLIENT_IDENTIFIER Returns the client identifier (global context) Yes Yes Yes
CLIENT_INFO User session information Yes Yes Yes
CURRENT_BIND Bind variables for fine-grained auditing No Yes Yes
CURRENT_SCHEMA Returns the default schema used in the current schema Yes Yes Yes
CURRENT_SCHEMAID Returns the identifier of the default schema used in the current schema Yes Yes Yes
CURRENT_SQL Returns the SQL that triggered the audit event Yes Yes Yes
CURRENT_SQL_LENGTH Returns the length of the current SQL statement that triggered the audit event No Yes Yes
CURRENT_USER Name of the current user Yes No No
CURRENT_USERID Userid of the current user Yes No No
DB_DOMAIN Domain of the database from the DB_DOMAIN initialization parameter Yes Yes Yes
DB_NAME Name of the database from the DB_NAME initialization parameter Yes Yes Yes
DB_UNIQUE_NAME Name of the database from the DB_UNIQUE_NAME initialization parameter No Yes Yes
ENTRYID Available auditing entry identifier Yes Yes Yes
ENTERPRISE_IDENTITY Returns the user’s enterprise-wide identity No Yes Yes
EXTERNAL_NAME External of the database user Yes No No
FG_JOB_ID If the session was established by a client foreground process, this parameter will return the Job ID. Otherwise, it will return NULL. Yes Yes Yes
GLOBAL_CONTEXT_MEMORY The number used in the System Global Area by the globally accessed context Yes Yes Yes
GLOBAL_UID The global user ID from Oracle Internet Directory for enterprise security logins. Returns NULL for all other logins. No No Yes
HOST Name of the host machine from which the client has connected Yes Yes Yes
IDENTIFICATION_TYPE Returns the way the user’s schema was created No Yes Yes
INSTANCE The identifier number of the current instance Yes Yes Yes
INSTANCE_NAME The name of the current instance No Yes Yes
IP_ADDRESS IP address of the machine from which the client has connected Yes Yes Yes
ISDBA Returns TRUE if the user has DBA privileges. Otherwise, it will return FALSE. Yes Yes Yes
LANG The ISO abbreviate for the language Yes Yes Yes
LANGUAGE The language, territory, and character of the session. In the following format: language_territory.characterset Yes Yes Yes
MODULE Returns the appplication name set through DBMS_APPLICATION_INFO package or OCI No Yes Yes
NETWORK_PROTOCOL Network protocol used Yes Yes Yes
NLS_CALENDAR The calendar of the current session Yes Yes Yes
NLS_CURRENCY The currency of the current session Yes Yes Yes
NLS_DATE_FORMAT The date format for the current session Yes Yes Yes
NLS_DATE_LANGUAGE The language used for dates Yes Yes Yes
NLS_SORT BINARY or the linguistic sort basis Yes Yes Yes
NLS_TERRITORY The territory of the current session Yes Yes Yes
OS_USER The OS username for the user logged in Yes Yes Yes
POLICY_INVOKER The invoker of row-level security policy functions No Yes Yes
PROXY_ENTERPRISE_IDENTITY The Oracle Internet Directory DN when the proxy user is an enterprise user No Yes Yes
PROXY_GLOBAL_UID The global user ID from Oracle Internet Directory for enterprise user security proxy users. Returns NULL for all other proxy users. No Yes Yes
PROXY_USER The name of the user who opened the current session on behalf of SESSION_USER Yes Yes Yes
PROXY_USERID The identifier of the user who opened the current session on behalf of SESSION_USER Yes Yes Yes
SERVER_HOST The host name of the machine where the instance is running No Yes Yes
SERVICE_NAME The name of the service that the session is connected to No Yes Yes
SESSION_USER The database user name of the user logged in Yes Yes Yes
SESSION_USERID The database identifier of the user logged in Yes Yes Yes
SESSIONID The identifier of the auditing session Yes Yes Yes
SID Session number No Yes Yes
STATEMENTID The auditing statement identifier No Yes Yes
TERMINAL The OS identifier of the current session Yes Yes Yes

 

Örnek olarak veri tabanınızın adına ya da türüne göre bir sayaç değeri almak istiyorsunuz, bu durumda aşağıdaki gibi bir örnek ile konuyu anlatmaya çalışayım:

DECLARE
    vDBName VARCHAR2(30);
    nSayac  NUMBER := 0;
BEGIN
    vDBName := SYS_CONTEXT('USERENV','DB_NAME');
    IF vDBName = 'DBDEV' THEN
        nSayac := 1;
    ELSIF vDBName = 'DBTEST'  THEN
        nSayac := 2;
    ELSIF vDBName = 'DBPROD' THEN
        nSayac := 3;
    END IF;
END;

Burada, SYS_CONTEXT(‘USERENV’,’DB_NAME’) ifadesi ile kullanıcının üzerinde çalıştığı veri tabanı bilgisi (ismi) alınarak vDBName isimli VARCHAR2 tipindeki değişkene atanıyor.
Sonrasında bu değişkenin eşitine göre üzerinde çalışılan ortamın geliştirme (DBDEV), test (DBTEST) veya üretim (DBPROD) ortamlarından sırasıyla hangisi olduğu tespitine göre nSayac isimli NUMBER türündeki değişkene bir sayı değeri atanıyor.

Burada spesifik bir iş yapmıyoruz belki; ama geliştirme yapan kişinin hayal gücüne bağlı olarak buradaki senaryo inanılmaz boyutlarda geliştirilebilir ve işlenebilir.

Konu ile ilgili olarak aklınıza takılan bir soru olursa hiç çekinmeden “yorumlar” üzerinden iletmenizi rica ederim, elimden geldiğince yardımcı olmaya çalışacağım, sağlıcakla kalın…

Oracle PL/SQL içinde yayınlandı | , ile etiketlendi | 2 Yorum

Index (İndeks)


Yapım aşamasında.

Oracle PL/SQL içinde yayınlandı | , ile etiketlendi | Yorum bırakın

View (Görünüm)


Yapım aşamasında.

Oracle PL/SQL içinde yayınlandı | , ile etiketlendi | Yorum bırakın

Trigger (Tetikleyici)


Yapım aşamasında

Oracle PL/SQL içinde yayınlandı | , ile etiketlendi | Yorum bırakın

Function (Fonksiyon)


Yapım aşamasında

Oracle PL/SQL içinde yayınlandı | , ile etiketlendi | Yorum bırakın

Stored Procedure


Yapım aşamasında

Oracle PL/SQL içinde yayınlandı | , , , ile etiketlendi | Yorum bırakın

Roles (Roller)


Merhaba arkadaşlar, bu makalemizde öncelikle rol’ün tanımını ve özelliklerini öğreneceğiz. Ayrıca CREATE ROLE ile rollerin oluşturulması, GRANT/REVOKE deyimleri ile rollere ayrıcalıkların verilmesi ya da verilen ayrıcalıkların alınması, ENABLE/DISABLE deyimleri ile rollerin etkinleştirilmesi ya da etkin olan rollerin devre dışı bırakılması, DEFAULT ROLE ile varsayılan rolün ayarlanması, DROP ROLE ile mevcut rollerin kaldırılması gibi bir çok işlevi belirli sözdizimleri kullanarak nasıl yapacağımızı göreceğiz.

Öncelikle rol’ün tanımını yaparak başlayalım.

Rol nedir? Özellikleri nelerdir?

Rol, bir kullanıcıya veya başka bir role atayabileceğiniz ayrıcalıklar grubudur. Birden çok kullanıcı ve role bir rol verebilirsiniz. Bir role bir ayrıcalık verildiğinde ya da verilen ayrıcalık geri alındığında, bu role sahip tüm kullanıcılar ve roller de verilen ayrıcalığa otomatik olarak sahip olur veya bu ayrıcalığı kaybederler. Bir kullanıcı veya role birden fazla rol atayabilirsiniz. Bir rol için parola tanımlayabilirsiniz. Kabaca bu adam ne biçim bir adamdır? Ne iş yapabilir ya da ne iş yapamaz, ayrıcalıkları nelerdir? Hangi seviye ayrıcalıklara sahiptir gibi sorular sorduğumuzda bu sorulara karşılık gelen tanım rol tanımıdır.

Roller

Mantıksal olarak kullanıcı gruplarına vereceğiniz izinleri belirlemek için rol oluşturmalısınız. Ama bir rol oluşturabilmek için CREATE ROLE sistem ayrıcalığına sahip olmanız gerektiğini unutmamalısınız.

Daha somut bir anlatımla; içinde bulunduğunuz bir ekipte yazılımcıların ve iş analistlerinin olduğunu düşünün. Bu durumda yazılımcıların (veritabanı yönetiminin izin verdiği ölçüde) her türlü obje üzerinde değişiklik yapma, procedure oluşturma, fonksiyon oluşturma, bunlar üzerinde değişiklikler yapma, index oluşturma, tablo create etme, kolon ekleme, mevcut bir kolonu kaldırma, hatta tablo drop etme, truncate etme gibi bir takım işlemleri yapabildiğini düşünün, fakat yazılımcıların aksine iş analistlerinin bunlara izinlerinin olmadığı, sadece sorgulama yapabildiği ya da silme işlemleri yapabildiğini düşünün, işte bu izinlerin yönetilmesi ancak rollere ya da kullanıcılara verilebilecek ayrıcalıklar ile mümkündür.

SÖZDİZİMİ:

Oracle’da rol oluşturmak için kullanılan sözdizimi aşağıdaki gibidir:

CREATE ROLE role_name
[ NOT IDENTIFIED | IDENTIFIED {BY password | USING [schema.] package | EXTERNALLY | GLOBALLY } ];

role_name
Oluşturduğunuz rol adı.

NOT IDENTIFIED
Rolün hemen etkin olacağı anlamına gelir. Şifre olmadan rolü etkinleştirmek için kullanılır.

IDENTIFIED
Rolü etkinleştirmeden önce bir kullanıcı tarafından belirtilen yöntem ile onaylanması gerektiği anlamına gelir.

BY password
Rolü etkinleştirmek için yetkili bir kullanıcı tarafından bir parola girilmesi gerektiği anlamına gelir.

USING package
Sadece uygulamaların yetkili olduğu (Uygulama Rolü) bir paket kullanarak etkinleştirilebileceği anlamına gelir.

EXTERNALLY
Bir kullanıcının harici bir servis vasıtasıyla rolünü etkinleştirmek için yetkili olması gerektiği anlamına gelir. Harici servis bir işletim sistemi veya üçüncü parti bir servis olabilir.

GLOBALLY
Bir kullanıcının kurumsal dizin hizmeti veren bir servis (enterprise directory service) vasıtasıyla rolünü etkinleştirmek için yetkili olması gerektiği anlamına gelir.

Eğer NOT IDENTIFIED ve IDENTIFIED ifadelerinin her ikisi birden CREATE ROLE sözdiziminde belirtilmezse, rol varsayılan olarak NOT IDENTIFIED olarak oluşturulur.

Örneğin;

CREATE ROLE test_rol;

Bu ilk örnekte test_rol adında bir rol oluşturuluyor.

CREATE ROLE test_rol IDENTIFIED BY sifre123;

Aynı rol bu ikinci örnekte de oluşturuluyor; ama bu sefer şifre koruma ile oluşturuluyor.

ROL’E TABLO AYRICALIKLARI VERME

Oracle’da bir rolü oluşturduğunuzda, bunun ikinci adımı bu role vereceğiniz ayrıcalıkları belirlemek olacaktır. Kullanıcılar için ayrıcalıklar tanımlar gibi roller için de belirli yetkileri tanımlayabilirsiniz. İlk olarak tablo ayrıcalıklarını nasıl vereceğimizi inceleyelim. Tablo ayrıcalıklarını SELECT, INSERT, UPDATE, DELETE, REFERENCES, ALTER, INDEX veya ALL ifadelerinin farklı kombinasyonlarını kullanarak verebilirsiniz.

Sözdizimi;

Oracle’da bir role verebileceğiniz ayrıcalıklar için aşağıdaki gibi bir söz dizimi kullanmalısınız:

GRANT privileges ON object_name TO role_name;

privileges
Role atanan ayrıcalıkları ifade eder, aşağıdaki değerlerden herhangi biri olabilir:

SELECT : Tablo üzerinde SELECT deyiminin işlevini yapabileceğini belirtir.
INSERT : Tablo üzerinde INSERT deyiminin işlevini yapabileceğini belirtir.
UPDATE : Tablo üzerinde UPDATE deyiminin işlevini yapabileceğini belirtir.
DELETE : Tablo üzerinde DELETE deyiminin işlevini yapabileceğini belirtir.
REFERENCES : Başvurulan tabloya bir kısıtlama (CONSTRAINT) oluşturabilme yeteneğini ifade eder.
ALTER : ALTER TABLE ifadesi ile tablo yapısını değiştirebilme yeteneğini tanımlar.
INDEX : Tablo üzerinde index (dizin) oluşturabilme yeteneğini ifade eder.
ALL : Tablodaki tüm ayrıcalıklara sahip olabileceğini ifade eder.

object_name
dedded

role_name
wedwdwedew

qwdqdqd

qwdqwd

Oracle PL/SQL içinde yayınlandı | , , , , , , , ile etiketlendi | 2 Yorum

DDL, DML, DCL ve TCL komutları arasındaki fark nedir?


DDL (Data Definition Language): Veri Tanımlama Dili (DDL) deyimleri tabloları, veritabanı yapısı veya şema tanımlamak için kullanılır.

Bunlardan bazıları;

CREATE – Veritabanındaki nesneleri oluşturmak için kullanılır.
ALTER – Veritabanı nesnelerinin yapısını değiştirmek için kullanılır.
DROP – Veritabanındaki nesneleri silmek ya da başka bir ifadeyle ilgili nesneleri bütünüyle kaldırmak için kullanılır.
TRUNCATE – Kayıtlar için ayrılan tüm boşluklar dahil, bir tablodaki tüm kayıtları kaldırılır
COMMENT – Veri sözlüğüne yorum eklemek için kullanılır.
RENAME – Bir nesneyi yeniden adlandırmak için kullanılır.

DML (Data Manipulation Language): Veri İşleme Dili (DML) deyimleri tablo ya da şema nesneleri içindeki verileri yönetmek için kullanılır.

Bunlardan bazıları;

SELECT – Veritabanından kayıt çekmek için kullanılır.
INSERT – Tabloya kayıt ya da kayıtları eklemek için kullanılır.
UPDATE – Tablodaki kayıt ya da kayıtları güncellemek için kullanılır.
DELETE – Tablodan kayıt ya da kayıtları silmek için kullanılır (Veriler silinse de ancak kapladığı alan kalır)
MERGE – UPSERT işlemi (ekleme veya güncelleme), başka bir ifadeyle birleştirme yapar.
CALL – PL/SQL veya Java alt programını çalıştırır.
EXPLAIN PLAN – Verilere erişim yolunun detaylarını açıklamak için kullanılır.
LOCK TABLE – Kontrolü eş zamanlılığı sağlamak için kullanılır.

DCL (Data Control Language): Veri Kontrol Dili (DCL) deyimleri yetkilendirme ya da ayrıcalıkları belirlemek için kullanılır.

Bunlardan bazıları;

GRANT – Belirli bir kullanıcı ya da gruba veritabanının belirtilen nesnelerine erişim ayrıcalıklarını verir.
REVOKE – GRANT komutu ile verilen ayrıcalıkların bir kısmını ya da tümünü geri almak için kullanılır.

TCL (Transaction Control): İşlem Kontrol (TCL) deyimleri DML ifadeleri tarafından yapılan değişiklikleri yönetmek için kullanılır.

Bunlardan bazıları;

COMMIT – Yapılanları kalıcı hale getirir. İşin tamamlanmasını sağlar.
SAVEPOINT – Daha sonra geri dönülecek bir dönüş noktası belirler.
ROLLBACK – Son COMMIT’e kadar olan yeri geri alır.

Umarım faydalı bir içerik olmuştur, tekrar görüşmek üzere sağlıcakla kalın..

Oracle PL/SQL içinde yayınlandı | , , , ile etiketlendi | 3 Yorum