2015-02-17 15 views
5

değiştirir:SQL Server Bu soru benim bir önceki yazı/çözümün çıktı

adding a field somehow effects a views results

IMO kendi yazı hak ediyor. SQL Server 2008 R2'yi kullanma.

Görünümde başvurulan bir tabloya bir sütun ekledikten sonra, neden görünümleri yenilemek zorundayım? Bu gönderi/soruyu cevaplamak için doğrudan gerekli olmasa da, özel senaryonun senaryo/davranışları, yukarıda bağlantılı olan postayla açıklanmaktadır.

Ben büyük bir hayran yelpazesi değilim. Çok nadiren onları dürüst olmak için yaratıyorum, orijinal olarak yazmadığım bir kodla çalışıyorum. Asıl yazmadığınız 70'den fazla görünümünüz olduğunu varsayalım. Bu nedenle, bir veri tabanı sütunu eklediğinizde hangisinin yenilenmesi gerektiğine dair hiçbir fikriniz yok. Herhangi bir tablonun ne olursa olsun herhangi bir tabloyu herhangi bir etki yapmadan net olarak ekleyebilmem gerekir. Bir iş birimi, herhangi bir zamanda eklenmiş herhangi bir sayıda alan gerektirebilecek her türlü değişiklik talebini artırabilir.

Elbette buna başka bir yaklaşım var mı?

+1

Görünüm, her arandığında kendisini dinamik olarak yeniden düzenlemek için yalnızca bir sorgu değil. Bir şema, sütun ve benzeri ile örneklenmiştir. Sonuç kümesine ek sütun eklemenin beklenmedik şekilde davranabileceği birçok durum vardır (başvuru yaptığınız bağlantıdaki gibi). Bu tür, istediğiniz daha fazla lax uygulamasının ters yönüne giderken, görünümler, alttaki nesnelere şema değişikliklerini yasaklayan SCHEMABINDING seçeneği ile de bildirilebilir. Ancak, birkaç yerde belirtildiği gibi, yeni bir sütun almak için bir şema istiyorsanız, sp_refreshview – Xedni

+0

kullanmanız gerekir. Zaman ayırdığınız için teşekkür ederiz. Hoşlanmasam da, mantıklı. Görüşlere kaynak verimliliği avantajı olduğunun farkındayım. Bu, şu anda onları daha az sevdiğime eminim. Bir tabloya bir sütun eklemenin bir sonucu olarak bugün gördüğüm son kullanıcı deneyimi 0 düzensiz oldu. – Mat41

+2

Görünümler her zaman kötü değil. Karmaşık sorguları basitleştirmek, uygulamalarda veya depolanmış prozlar arasında paylaşılabilen sorgularda iş kurallarını standart hale getirmek, üçüncü parti veritabanlarına (özellikle de AE1401 gibi arkaik isimleri olan eski kitaplar) sorgulamak alan adı FN144, vb.) ve uygulamalar bir tabloyu paylaştığında, alttaki tablo alanı değişmişse, görünüm adı birden fazla uygulamayı değiştirmenizi zorlamayacak şekilde aynı kalabilir. –

cevap

4

tablo değişiklikten etkilenmektedir hangi görüşleri tespit etmek dinamik yönetim görünümleri kullanın, bu durumdan etkilenen görüş sonuçları döngü Burada adapte olabilecek bir hızlı bir senaryo sp_refreshview (https://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx)

çağırmak için dinamik sql kullanmak saklanan bir proc için isterseniz:

DECLARE @TableName VARCHAR(500) = 'dbo.Accounts' 

DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500)) 
    INSERT @ViewsToUpdate 
     SELECT 
      Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME 
     FROM INFORMATION_SCHEMA.TABLES [Views] 
      INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews 
       ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA 
        AND DependingViews.referencing_entity_name = Views.TABLE_NAME 
     WHERE [Views].TABLE_TYPE = 'View' 

WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN 
    DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate) 
    DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + '''' 
    EXEC sys.sp_executesql @Sql 
    DELETE @ViewsToUpdate WHERE ViewName = @ViewName 
END 
+0

Seçilen bir tabloyla ilgili görünümleri otomatik olarak yenilemek için kod örneği eklendi –

+0

Zaman ayırdığınız için teşekkür ederiz. Sorunu yeniden oluşturmak için bir onay beklemem gerekecek ve sonra bunu çalıştırıp/test etmem gerekiyor ama kesinlikle gerekli tüm görünümleri süpürmek için iyi bir çözüm gibi görünüyor! – Mat41

+1

Yine de olsa, hepimiz için bir tablo toptan referansı kadar basitse, SYNONYM özelliğidir. Bu, adından da anlaşılacağı gibi, sorgulamanızı doğrudan eşanlamlı olduğu nesneye doğru gönderen bir tablo için bir takma ad oluşturur (bu bir sözcük mü?). Daha sonra, bu nesneye bir sütun eklerseniz, temel olarak temelde yatan nesne olduğundan otomatik olarak eklenir. – Xedni