View’ları Güncellemenin Önemi

Tablomuza yeni bir kolon eklediğimizde var olan View da ki davranışı gözlemleyeceğiz.

Örnek tablomuzu oluşturalım ,

CREATE TABLE SQLTR_Demo_DB (
	Id INT IDENTITY (1, 1) PRIMARY KEY CLUSTERED
   ,Name VARCHAR(100)
   ,SurName VARCHAR(150)
)
GO

Örnek bir kaç veri basalım tablomuza,

INSERT INTO SQLTR_Demo VALUEs ('Yusuf','KAHVECİ');
INSERT INTO SQLTR_Demo VALUEs ('Yaşar','KAHVECİ');
INSERT INTO SQLTR_Demo VALUEs ('Zeus','Parside');

Şimdide bu tabloyu full çeken bir View oluşturalım ,

 CREATE VIEW vW_SQLTR_Demo
AS
SELECT
	*
FROM SQLTR_Demo_DB;
GO

Oluşturduğumuz View ile data çekelim ,

SELECT
	*
FROM vW_SQLTR_Demo

Şimdi ise tablomuza bir kolon ekleyelim ,

ALTER TABLE SQLTR_Demo_DB ADD Adress NVARCHAR(200)

Şimdi View ‘ımız tekrar çektiğimizde yeni eklenen kolonun sonuç kümeisnde dönmediğini aşağıda görmektesiniz.

SELECT
	*
FROM vW_SQLTR_Demo

Peki bu durumu nasıl düzelteceğiz diye sorduğunuzu duyar gibiyim. Ya da diğer bir sorunuz ise bu neden ve ne için bu şekilde oldu tüm datayı çekmek istememize rağmen !!!

İlk etapta neden bu şekilde sonuç getirdiğine açıklık getirmek gerekir ise , SQL Server View dan dönecek kolon bilgilerini metadata tablolarında saklamasından dolayı SELECT * ile oluşturulan View larda yeni eklenen kolonlar sonuca yansımamaktadır.

Örneğimizdeki View ın kolon bilegilerine metadata tablosundan erişmek istediğimizde ;

SELECT
	*
FROM sys.Columns
WHERE OBJECT_NAME(object_id) = 'vW_SQLTR_Demo'

Gördüğünüz üzere View ‘ımızın tüm bilgileir metadata tablolarına işlenmiş durumda. Peki bu durumu nasıl düzeltebiliriz ?

Aslında en kullanışlı ve sağlıklı çözüm yöntemi sp_refreshView sistem prosedürü ile View ‘ın güncellenmesini sağlamaktır. Bu şekilde View ‘ın arkatarafta metadata tablolarında ki bilgileride güncellenir ve tekrar View ‘ı çekmek istediğinizde kolon bilgisini görmüş olursunuz.

EXEC sp_refreshview 'vW_SQLTR_Demo'
GO
SELECT * FROM vW_SQLTR_Demo

Gördüğünüz üzere artık yeni eklediğimiz kolonumuz da sonuca gelmektedir .

Tekrar metadata tablosunu sorguladığımızda ,

SELECT
	*
FROM sys.Columns
WHERE OBJECT_NAME(object_id) = 'vW_SQLTR_Demo'

 

NOT 1 : Veritabanımız da ki tüm View ları belirli periyotlar ile Reflesh leme yapabilmeniz için bu makaleyi okuyunuz…

NOT 2 : DB üzerinde ki değilde sadece o tablo üzerinde değişiklik yapıldığından o tablou içeren tüm View ları Reflesh yapmak ister isek,

SELECT DISTINCT
	name AS ViewName
   ,'EXEC sp_refreshview ''' + name + '''' AS Script
FROM sys.Objects AS so
INNER JOIN sys.sql_expression_dependencies AS sed
	ON so.object_id = sed.referencing_id
WHERE so.type = 'V'
AND sed.referenced_id = OBJECT_ID('dbo.SQLTR_Demo_DB');

Yukarıda ki script içerisinde OBJECT_ID bölümüne tablomuzun adını yazıyoruz ve bu şekilde query mizi EXEC ettiğimizde aşağıda ki gibi sonuç çıkmaktadır.

Script bölümünde ne kadar View sonucu çıkıyor ise kopyalanıp query ekranında EXEc edilrek bu şekilde kolon eklenen tablo nun içerildiği tüm view lar güncellenmiş olacaktır.

 

Kolay Gelsin.

Leave a Reply

Your email address will not be published. Required fields are marked *