SOLID Prensipleri: Nesne Yönelimli Tasarımın Temel Taşları


SOLID, yazılım geliştirme sürecinde kodun daha okunaklı, esnek ve sürdürülebilir olmasını sağlayan beş temel prensibi ifade eder. Bu prensipler, Robert C. Martin (Uncle Bob) tarafından tanımlanmıştır ve nesne yönelimli programlamanın (OOP) en iyi uygulamalarını temsil eder. İşte SOLID prensiplerinin açıklamaları ve her biri için birer örnek:

1. Single Responsibility Principle (SRP) – Tek Sorumluluk Prensibi

Bir sınıfın yalnızca tek bir sorumluluğu olmalıdır. Yani, bir sınıf yalnızca tek bir amaç için değiştirilebilir olmalıdır.

Örnek:

Yanlış kullanım:

class ReportGenerator
{
    public void GenerateReport() { /* Rapor oluşturma işlemleri */ }
    public void SaveToFile() { /* Dosyaya kaydetme işlemleri */ }
}

Doğru kullanım:

class ReportGenerator
{
    public string GenerateReport() { return "Rapor İçeriği"; }
}

class FileManager
{
    public void SaveToFile(string content) { /* Dosyaya kaydetme işlemleri */ }
}

2. Open/Closed Principle (OCP) – Açık/Kapalı Prensibi

Bir sınıf genişletilmeye açık, ancak değiştirilmeye kapalı olmalıdır. Yani, mevcut kod değiştirilmeden yeni işlevler eklenebilmelidir.

Örnek:

Yanlış kullanım:

class DiscountCalculator
{
    public double CalculateDiscount(string customerType, double price)
    {
        if (customerType == "Regular") return price * 0.9;
        else if (customerType == "VIP") return price * 0.8;
        return price;
    }
}

Doğru kullanım (Genişletilebilir bir yapı kullanımı):

interface IDiscountStrategy
{
    double ApplyDiscount(double price);
}

class RegularDiscount : IDiscountStrategy
{
    public double ApplyDiscount(double price) => price * 0.9;
}

class VIPDiscount : IDiscountStrategy
{
    public double ApplyDiscount(double price) => price * 0.8;
}

3. Liskov Substitution Principle (LSP) – Liskov’un Yerine Koyma Prensibi

Bir alt sınıf, üst sınıfın yerine kullanılabilmelidir ve programın davranışı bozulmamalıdır.

Örnek:

Yanlış kullanım:

class Bird
{
    public virtual void Fly() { }
}

class Penguin : Bird
{
    public override void Fly() { throw new Exception("Penguenler uçamaz!"); }
}

Doğru kullanım:

abstract class Bird { }

interface IFlyable
{
    void Fly();
}

class Sparrow : Bird, IFlyable
{
    public void Fly() { /* Uçma işlemi */ }
}

class Penguin : Bird
{
    // Uçamayan bir kuş olarak tanımlandı
}

4. Interface Segregation Principle (ISP) – Arayüz Ayrımı Prensibi

Büyük ve kapsamlı arayüzler yerine, daha küçük ve özelleşmiş arayüzler oluşturulmalıdır.

Örnek:

Yanlış kullanım:

interface IWorker
{
    void Work();
    void Eat();
}

class Robot : IWorker
{
    public void Work() { /* Çalışma işlemi */ }
    public void Eat() { throw new Exception("Robotlar yemek yemez!"); }
}

Doğru kullanım:

interface IWorkable { void Work(); }
interface IEatable { void Eat(); }

class Human : IWorkable, IEatable
{
    public void Work() { /* Çalışma işlemi */ }
    public void Eat() { /* Yemek yeme işlemi */ }
}

class Robot : IWorkable
{
    public void Work() { /* Çalışma işlemi */ }
}

5. Dependency Inversion Principle (DIP) – Bağımlılığı Ters Çevirme Prensibi

Üst seviye modüller, alt seviye modüllere doğrudan bağımlı olmamalıdır. Bunun yerine, her ikisi de soyutlamalara (interface veya abstract sınıflar) bağımlı olmalıdır.

Örnek:

Yanlış kullanım:

class DatabaseLogger
{
    public void Log(string message) { /* Log işlemi */ }
}

class Service
{
    private DatabaseLogger _logger = new DatabaseLogger();
    public void DoSomething() { _logger.Log("İşlem yapıldı"); }
}

Doğru kullanım:

interface ILogger
{
    void Log(string message);
}

class DatabaseLogger : ILogger
{
    public void Log(string message) { /* Log işlemi */ }
}

class Service
{
    private readonly ILogger _logger;
    public Service(ILogger logger) { _logger = logger; }
    public void DoSomething() { _logger.Log("İşlem yapıldı"); }
}

Sonuç olarak;

SOLID prensipleri, yazılım projelerinin sürdürülebilir, esnek ve kolay bakım yapılabilir olmasını sağlar.

  • SRP ile her sınıfın tek bir sorumluluğu olur.
  • OCP sayesinde mevcut kod bozulmadan genişletilebilir.
  • LSP ile alt sınıflar, üst sınıfların yerine sorunsuzca kullanılabilir.
  • ISP ile gereksiz bağımlılıklar azaltılır.
  • DIP ile modüller arası bağımlılıklar en aza indirilerek daha esnek bir yapı oluşturulur.

Bu prensiplere uygun kod yazmak, yazılım projelerinizin daha sağlıklı ve uzun ömürlü olmasına katkı sağlayacaktı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


C# programlama dilinde “const”, “readonly” ve “static” anahtar kelimeleri, veri saklama ve yönetme konusunda önemli roller oynar. Ancak her biri farklı kullanım alanlarına sahiptir ve belirli senaryolarda tercih edilir. Bu yazıda, bu üç anahtar kelimenin farklarını detaylı bir şekilde inceleyeceğiz.

1. Const (Sabit Değerler)

const anahtar kelimesi, derleme zamanında değeri belirlenen ve değiştirilemez sabitler oluşturmak için kullanılır.

Özellikleri:

  • Değeri yalnızca tanımlandığında atanabilir ve sonrasında değiştirilemez.
  • Derleme zamanında (compile-time) sabitlenir.
  • Sadece temel veri türleri (primitive types) ve string ile kullanılabilir.
  • Nesne başlatıcısı (constructor) içinde atanamaz.
  • static olarak tanımlanmadan da kullanılabilir.

Kullanım Örneği:

class Example
{
    public const double Pi = 3.14159;
}

2. Readonly (Salt Okunur Değişkenler)

readonly anahtar kelimesi, değerinin sadece nesne oluşturulurken (constructor içinde) veya değişken tanımlandığında atanmasını sağlar.

Özellikleri:

  • Değeri sadece tanımlandığında veya constructor içinde atanabilir.
  • Çalışma zamanında (runtime) değişkenin değeri belirlenebilir.
  • const’tan farklı olarak, referans tipleri de içerebilir.
  • Değer ataması nesne oluşturulduğunda yapılabildiği için, dinamik verilerle kullanılabilir.
  • Static olarak da tanımlanabilir, ancak atama işlemi yalnızca bir kez yapılır.
  • Readonly değişkenler, yalnızca okunabilir olup, bir kez atandıktan sonra değiştirilemez.

Kullanım Örneği:

class Example
{
    public readonly int MyValue;

    public Example(int value)
    {
        MyValue = value; // Constructor içinde atama yapılabilir.
    }
}

Static Readonly

Bir değişken hem static hem de readonly olarak tanımlanabilir. Bu durumda, değeri yalnızca sınıf ilk yüklendiğinde atanabilir ve sonrasında değiştirilemez.

class Example
{
    public static readonly int MaxValue;

    static Example()
    {
        MaxValue = 100; // Static constructor içinde atanabilir.
    }
}

3. Static (Statik Üyeler)

static anahtar kelimesi, bir sınıfa ait üyelerin nesne oluşturmadan erişilebilir olmasını sağlar.

Özellikleri:

  • Nesneye değil, sınıfa ait olur.
  • Tüm nesneler için ortak bir değişken veya metot sağlar.
  • Constructor içinde kullanılabilir, ancak yalnızca static constructor içinde.
  • Static değişkenler program süresince bellekte kalır.
  • Static metotlar, yalnızca static üyelerle çalışabilir.
  • Static sınıflar oluşturulabilir ve bu sınıfların tüm üyeleri static olmak zorundadır.
  • Static üyeler, nesne örneği oluşturulmadan doğrudan sınıf adı üzerinden erişilebilir.

Kullanım Örneği:

class Example
{
    public static int Counter = 0;
    
    public static void IncreaseCounter()
    {
        Counter++;
    }
}

Static Constructor

Static bir sınıfın veya static üyelerin başlatılması için static constructor kullanılabilir. Bu constructor, sınıfın ilk çağrıldığı anda çalıştırılır ve yalnızca bir kez çalıştırılır.

class Example
{
    public static int Counter;

    static Example()
    {
        Counter = 10; // Static constructor içinde başlatma yapılabilir.
    }
}

Static Sınıflar

Static sınıflar, yalnızca static metotlar ve değişkenler içeren sınıflardır. Nesne oluşturulamaz ve tamamen yardımcı (utility) sınıflar olarak kullanılırlar.

static class MathHelper
{
    public static double Square(double number)
    {
        return number * number;
    }
}

Const vs Readonly vs Static

ÖzellikConstReadonlyStatic
Değeri değiştirilebilir mi?HayırSadece constructor içinde atanabilirEvet
Ne zaman belirlenir?Derleme zamanıÇalışma zamanıÇalışma zamanı
Nesneye mi bağlıdır?HayırEvetHayır (Sınıfa bağlıdır)
Hangi türlerle kullanılabilir?Temel türler ve stringHerhangi bir türHerhangi bir tür

Sonuç

  • Sabit bir değer için const kullanılır.
  • Nesne oluşturma sürecinde değişken ataması gerekiyorsa readonly tercih edilir.
  • Tüm nesneler arasında ortak bir değişken veya metod gerekiyorsa static kullanılır.

Umarım bu yazı, C#’ta const, readonly ve static anahtar kelimeleri arasındaki farkları anlamanıza yardımcı olmuştur.

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