CREATE SCHEMA SÖZ DEYİMİ İLE TRANSACTIONAL DDL ALT YAPISI

Herkese Selam,

Bu yazıda sizlere Oracle’da TRANSACTIONAL DDL kavramından bahsedeceğim. Umarım farkındalık anlamında faydalı bir yazı olur.

Oracle’da transaction yönetiminin nasıl yapıldığı ile ilgili Oracle’ile ilgilenen insanların belirli bir fikri vardır. (Olmayanlar aşağıdaki linklere göz atarak kabaca fikir sahibi olabilirler. Transactions-1 Transactions-2  Transactions-3) Bundan hareketle DDL ve DML işlemlerinnin transaction mantıklarının temelde farklı olduğu açıktır. Biz bu yazıda autocommit olan DDL operasyonlarının nasıl transactional bir şekilde işlenebileceğine göz atacağız.

Oracle’da DDL operasyonlarının öncesinde ve sonrasında implicit bir commit çalıştırıldığı bilgisine sahibiz. Bu davranışla aslında her DDL için ayrı bir transaction başlatıldığını ve sonlandırıldığını söylememiz yanlış olmaz. Ancak Oracle bu davranışı her operasyon için olmasada belirli DDL operasyonları için transactional hale getirebiliyor. Yani ard arda yapacağımız DDL operasyonlarının her biri için arka tarafta yeni bir transaction açılıp sonlandırılmıyor.  İlgili DDL bloğunun tamamı için bir transaction açılıyor ya hepsi başarılı bir şekilde çalışıyor yada herhangi biri çalışırken hata aldığında yapılan tüm DDL operasyonları geri alınıyor.

Peki hangi DDL operasyonlarını tek bir transaction içerisinde çalıştırabiliyorum?

  • CREATE TABLE
  • CREATE VIEW
  • GRANT

Şimdi temel bilgileri verdikten sonra bu işlemin nasıl yapılacağını örneklendirelim.

Bu operasyonu yapabilmek için CREATE SCHEMA AUTHORIZATION söz deyimini kullanıyoruz. Ancak bu söz deyimini kullanmak için belli kurallara uymak zorundayız. Bu kurallar;

  • CREATE SCHEMA AUTHORIZATION söz deyiminden hemen sonra bir schema user’ı girmemiz gerekiyor. Ancak bu user, veritabanına bağlanıp ilgili DDL’leri çalıştıracağımız ve sonucunda objelerin oluşacağı schema user’ı ile aynı olmalı.

Örneğin HR user’ı altında bir tablo yaratmak istiyorsam, HR userı ile DB ye bağlanıp CREATE SCHEMA AUTHORIZATION HR  yazarak bu operasyonu başlatmalıyım. Burada şu ayrıntıyı unutmamak lazım CREATE SCHEMA komutu ile yeni bir şema oluşturmuyoruz!! Bu söz deyimi ile çalıştıracağımız DDL’ler için birden fazla transaction kullanmayacağımızı sisteme söylüyoruz.

Şimdi konuyu örnekleyerek anlaşılmasını sağlayalım.

CREATE SCHEMA AUTHORIZATION hr
CREATE TABLE authdetail
(
   id        NUMBER PRIMARY KEY,
   depname   VARCHAR2 (10)
)
GRANT ALL ON authdetail TO SCOTT
CREATE TABLE authmaster
(
   id             NUMBER PRIMARY KEY,
   name           VARCHAR2 (10),
   surname        VARCHAR2 (10),
   departmentid   NUMBER,
   CONSTRAINT fk_x FOREIGN KEY (departmentid) REFERENCES authdetail (XYXXXX)
);

Evet yukarıdaki örnekte authmaster tablosunu yaratırken oluşturduğumuz constraintte bilerek bir yanlış yaptım ve tüm ddl statement’ın hata almasını sağladım. Bu hata sonucunda authdetail tablosu başarılı bir şekilde yaratıldığı halde tablonun yaratılmadığını gözlemliyoruz. Aynı şekilde başarılı çalışan GRANT komutununda geri alındığını görüyoruz.

SELECT *
  FROM user_tables
 WHERE table_name = 'AUTHDETAIL';

-- no rows selected.

SELECT *
  FROM table_privileges
 WHERE owner = 'HR' AND TABLE_NAME = 'AUTHDETAIL';
-- no rows selected.

Evet örneğimizden de analaşılacağı üzere DDL statementlarımızı transactional hale getirebiliyoruz. Bu özellikle ile DDL ve DML statementlarımızı ortak kullandığımız kod bloklarımızda transactionının bölünmemesini sağlayabiliriz.

KAYNAKLAR

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_6014.htm

https://blogs.oracle.com/sql/entry/creating_multiple_tables_in_a

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Root, 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