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…
Teşekkürler Tuncay Bey, sizden daha çok makale bekliyorum.
Teşekkürler Burak Bey, estağfirullah, vakit buldukça yazmaya çalışıyoruz. Faydalı olabildiysek ne mutlu..