Bu sayfa makine çevirisidir. İngilizce orijinalini okuyun. English

IBSurgeon kütüphanesi

Görünümler (InterBase ve Firebird)

Alexey Kovyazin, son güncelleme 13-Nisan-2012

SQL diline aşina olanlar bu konunun ayrıntılı açıklamalarına ihtiyaç duymazlar, ancak sunum sırasını korumak için görünümlerin kısa bir tanımını yapacağız.

VIEW, sıradan tablolara yapılan sorgu temelinde oluşturulan sanal bir tablodur. Bir görünüm, sunucuda saklanan ve bir görünüme her başvurduğumuzda çalıştırılan sorgu olarak uygulanır.

Görünümleri kullanmanın farklı varyantlarını ele alalım. Görünümler, veri depolama yapısını türlerinden ayırmaya olanak tanıyan veri yapısı seviyeleri oluşturmayı sağlar. Örneğin, birkaç tablodan veri seçen bir görünüm oluşturabiliriz. İstemciler bu görünümü kullanıp doğrudan temel tablolara başvurmak yerine kullanırsa, veritabanı geliştiricisi görünümün altındaki sorguyu değiştirebilir, onu değiştirebilir (örneğin optimize edebilir) ve istemci hiçbir şey fark etmez - onun için aynı görünüm olacaktır. Görünümler, veri depolama yapısını kullanıcıdan izole etmelerinin yanı sıra, verileri daha uygun ve basit bir şekilde düzenlemeye olanak tanır. Veri yapısını “basitleştirme” sorunu, bir veritabanındaki tablo sayısı yeterince büyüdüğünde ve aralarındaki ilişkiler karmaşıklaştığında ortaya çıkar. Görünüm, belirli bir veritabanı istemcisi için gerekli olmayan (veya gerekli olan) verilerin bir kısmını ortadan kaldırmaya (veya tam tersine eklemeye) olanak tanır.

Ayrıca görünümler, InterBase veritabanında güvenliği daha basit bir şekilde düzenlemeye olanak tanır. Bazı kullanıcılar yalnızca görünümdeki verileri okuma / güncelleme haklarına sahip olabilir, ancak görünümün altındaki tablolar hakkında hakları (ve hatta bilgileri) olmayabilir! InterBase’de güvenlik hakkında daha fazla ayrıntı için “InterBase’de Güvenlik: kullanıcılar, işlevleri ve hakları” (bölüm 4) bölümüne bakın.

Görünümlerle çalışmak için DDL sözdizimi

Şimdi DDL (Veri Tanımlama Dili - SQL alt kümesi, sözlüğe bakın) tarafından tanımlanan görünüm oluşturma ve silme komutlarını ele alacağız. InterBase’de bir görünüm oluşturmak için aşağıdaki sözdizimine sahip cümleyi kullanmalıyız:

CREATE VIEW viewname [(view_column[, view_column…])] AS [WITH CHECK OPTION]; Burada viewname, veritabanı içinde benzersiz olması gereken görünümün adıdır ve ardından görünüme dahil edilen alanların her zaman zorunlu olmayan ad grubu gelir: [(view_column [, view_column …])]. Görünüme dahil edilen verileri seçen ifadeyi tanımlamak esastır. İsteğe bağlı WITH CHECK OPTION parametresini “Değiştirilmiş görünümler” bölümünde biraz sonra ele alacağız.

Görünümü değiştirmek için onu yeniden oluşturmamız, yani silip tekrar oluşturmamız gerekecek. Görünümü silerken, tüm bağımlı nesneleri de silmek gerekir - tetikleyiciler, saklı prosedürler ve diğer görünümler. Bu, görünümlerle çalışmanın ana zorluklarından biridir: görünümü kullanan nesne ağacını yeniden oluşturma gerekliliği (bunu kolaylaştıran yardımcı programlar vardır, örneğin IBAlterView, “Yönetici ve InterBase tasarımcı araçları” uygulamasına bakın). Görünümü silmek istiyorsak aşağıdaki DDL komutunu kullanmalıyız:

DROP VIEW viewname;

Görünüm örnekleri

İşte basit bir görünüm örneği:

CREATE VIEW MyView AS SELECT NAME, PRICE_1 FROM Table_example;

Bu örnekte, “Tablolar. Birincil anahtarlar ve üreteçler” bölümünde ele aldığımız Table_example tablosuna yapılan sorgu temelinde bir görünüm oluşturuyoruz. Bu durumda görünüm, Table_example tablosundan herhangi bir koşul olmadan seçilecek iki alandan - NAME ve PRICE_1 - oluşacaktır, yani MyView görünümündeki kayıt sayısı Table_example’daki kayıt sayısına eşit olacaktır. Ancak görünümler her zaman bu kadar basit değildir. Birden fazla tablodan ve hatta diğer görünümlerin temelinden veri alabilirler. Ayrıca görünümler, farklı ifadeler temelinde - toplama işlevleri dahil - alınan verileri içerebilir. Bu görünüm uygulamasının kullanımını daha ayrıntılı olarak ele almak için bire-çok ilişkisiyle (genellikle bu tür ilişkiye master-detail denir) bağlanan iki tablo oluşturalım. İşte bu tabloları oluşturmak için DDL betiği:

/\* Tablo: WISEMEN */

CREATE TABLE WISEMEN ( ID_WISEMAN INTEGER NOT NULL, WISEMAN_NAME VARCHAR(80));

/\* Birincil anahtar tanımı */

ALTER TABLE WISEMEN ADD CONSTRAINT PK_WISEMEN PRIMARY KEY (ID_WISEMAN);

/\* Tablo: WISEBOOK */

CREATE TABLE WISEBOOK ( ID_BOOK INTEGER NOT NULL, ID_WISEMAN INTEGER, BOOK VARCHAR(80));

/\* Birincil anahtar tanımı */

ALTER TABLE WISEBOOK ADD CONSTRAINT PK_WISEBOOK PRIMARY KEY (ID_BOOK);

/\* Yabancı anahtar tanımı */

ALTER TABLE WISEBOOK ADD CONSTRAINT FK_WISEBOOK FOREIGN KEY (ID_WISEMAN) REFERENCES WISEMEN (ID_WISEMAN);

Böylece, FOREIGN KEY kısıtlaması kullanılarak master-detail ilişkisiyle bağlanan iki tablo oluşturduk - WISEMEN ve WISEBOOK. Bu tabloların büyük Çinli bilgeler ve eserleri hakkında bilgi depolayacağını varsayalım. Şimdi bu tablolar temelinde birkaç görünüm oluşturabiliriz. Örneğin, her bilgenin kaç eseri olduğunu gösteren bir görünüm oluşturalım:

CREATE VIEW WiseBookCount (WISEMAN, HOW_WISEBOOKS) AS SELECT M.WISEMAN_NAME, COUNT(B.BOOK) FROM WISEMEN M, WISEBOOK B WHERE (M.ID_WISEMAN = B.ID_WISEMAN) GROUP BY M.WISEMAN_NAME

COUNT (), SUM (), MAX () gibi toplama işlevleri gibi hesaplanmış ifadeler kullanırken, görünüm alanlarının belirli adlarını kullanmanın, yani sorgu tarafından döndürülen tüm alanlara ad vermenin zorunlu olduğuna dikkat edin. Bu örnekten görebileceğimiz gibi, bu adların sorgu alanlarının adlarıyla çakışması gerekmez, ancak sayıları sorgu tarafından döndürülen alan sayısıyla çakışmalıdır. Sorgu tarafından döndürülen hangi alanın görünümün hangi alanına karşılık geldiğinin tanımı seri numaraya göre yapılır - ilk sorgu alanı görünümün ilk alanına yansıtılacaktır, ikincisi - ikinciye, vb.

Peki hangi bilgenin en çok kitap yazdığını bilmek istersek? Görünümün altındaki sorguya sıralama ifadesi - ORDER BY eklemeyi deneyeceğiz. Ancak bu deneme başarısız olacaktır: görünümlerde ORDER BY sıralamasının kullanımına izin verilmez ve ORDER BY içeren sorguyla görünüm oluşturmaya çalışıldığında hata oluşacaktır. Görünüm tarafından döndürülen sonuçları sıralamak istiyorsak, bunu istemci adına yapmamız gerekecek:

SELECT * FROM WiseBookCount ORDER BY HOW_WISEBOOKS

Bu SQL sorgusunun çalıştırılması istenen sonuca yol açacaktır. Görünümlerde ORDER BY ifadesinin kullanımı kısıtlamasının yanı sıra, saklı prosedürlerin çalıştırılması sonucunda alınan veri kümesini de veri kaynağı olarak kullanamayız (aşağıdaki “Saklı prosedürler” bölümüne bakın).

Belki de görünümlerin uygulanmasını gösteren bir örnek daha vermek değer. Adı “K” harfiyle başlayan bilgelerin listesini çıkarmamız gerektiğini varsayalım. Bu durumda, koşullu görünümü kullanacağız:

CREATE VIEW WiseMen2 (WISEMAN) AS SELECT M.WISEMAN_NAME FROM WISEMEN M WHERE M.WISEMAN_NAME LIKE ‘K%’

Böylece, belirli koşullara göre veritabanından veri seçerek sürekli güncellenebilir veri sağlayıcıları rolü oynayan görünümler oluşturmak kolaydır.

Değiştirilmiş görünümler

Yukarıda değiştirilmiş veri görünümleri oluşturma yeteneğinden bahsetmiştik. Gerçekten de öyledir - görünümden yalnızca veri okumak değil, aynı zamanda onları değiştirmek de mümkündür!

Görünümü değiştirilmiş yapmanın iki yolu vardır. İlk yol, görünüm benzersiz tablo (veya başka bir değiştirilmiş görünüm) temelinde oluşturulduğunda uygulanır ve verilen tablonun tüm sütunları NULL varlığına izin vermelidir. Böylece görünümün temel aldığı sorgu alt sorgular, toplama işlevleri, UDF, saklı prosedürler, DISTINCT ve HAVING ifadeleri içeremez. Tüm bu koşullar yerine getirilirse, görünüm otomatik olarak değiştirilmiş hale gelir, yani onun için DELETE, INSERT ve UPDATE sorgularını çalıştırabiliriz; bu sorgular kaynak tablodaki verileri değiştirir.

Koşul listesi oldukça etkileyicidir ve bu tür değiştirilmiş görünümlerin uygulanmasını büyük ölçüde kısıtlar, bu nedenle oldukça nadiren kullanılırlar.

Yukarıda listelenen koşullardan herhangi birini ihlal eden değiştirilmiş bir görünüm oluşturmak için tetikleyici mekanizması uygulanır. Tetikleyici hakkında daha fazla ayrıntı için “Tetikleyiciler” (bölüm 1) bölümüne bakın. Şimdi yalnızca VIEW’de veri değişikliği düzenlemenin genel ilkelerini ele alacağız.

Tetikleyiciler kullanarak güncellenmiş bir görünüm uygulamak için aşağıdakiler yapılmalıdır. Verilen görünüm için olaylar için 3 tetikleyici oluşturmak: BEFORE DELETE, BEFORE UPDATE ve BEFORE INSERT. Bu tetikleyicilerde silme, güncelleme ve ekleme sırasında verilerle ne yapılması gerektiğini tanımlamak.

Ardından verilen görünümü değişiklik sorgularında - DELETE, INSERT veya UPDATE - kullanmalıyız. InterBase bu sorguyu aldığında, verilen görünüm için uygun tetikleyicilerin olup olmadığını kontrol edecektir, yani BEFORE DELETE/INSERT/UPDATE. Yürütülebilir eylem için tetikleyici varsa, InterBase görünümün altındaki tablolardaki gerçek verileri değiştirmek için onu çağıracaktır (ancak bu diğer veriler de olabilir - bu tetikleyicilerin metin kısıtlamaları yoktur) ve ardından değişikliğin yapıldığı satırı (veya satırları) yeniden okuyacaktır.

Böylece, görünümlerde karmaşık veri güncelleme zincirlerini gerçekleştirme yeteneği vardır.

WITH CHECK OPTION seçeneği, görünüm oluşturma sözdiziminin açıklamasında belirtilmişti. Bu seçenek değiştirilmiş bir görünüm oluştururken ayarlanırsa, bu görünüme eklenen veya değiştirilen her veri satırı görünüme girme koşuluna göre kontrol edilecektir. Bu şöyle açıklanabilir: kullanıcı tarafından eklenen yeni bir kayıt veya mevcut kaydın güncellenmesi sonucunda elde edilen kayıt, VIEW için veri sağlayıcısı olan sorgunun koşullarını karşılamıyorsa, bu kaydın eklenmesi iptal edilecek ve bir hata oluşacaktır.

Sonuç

Görünümlerin oluşturulması ve kullanılmasının görünürdeki basitliğine rağmen, bir veritabanındaki veri organizasyonunu iyileştirmek için büyük yetenekler sağlarlar ve veri organizasyonu hiyerarşisi oluşturmaya olanak tanırlar.

Bazı veritabanı uygulaması tasarımcıları çalışmalarında görünümleri çok sık kullanır, diğerleri ise görünümlerin değiştirilmesinin karmaşıklığını ve veritabanı şemasını olabildiğince basit ve verimli tutma eğilimini gerekçe göstererek uygulamalarından kaçınır. Görünümleri çalışmanızda nasıl uygulayacağınız size kalmıştır. En önemli nokta, görünüm gibi güçlü bir aracın varlığını hatırlamak ve onu nasıl kullanacağınızı bilmektir.