Şema Açık İşlevinde / Saklı Yordam Oluşturma Denetimini Devre Dışı Bırakma


17

SQL Server 2008 R2 veritabanındaki değişiklikleri yürüten işlemi otomatikleştirmeye çalışıyorum. Yerleştirdiğim süreç, saklı yordamlarımı ve işlevleriimi düşürüyor ve yeniden oluşturuyor, ayrıca tabloları / sütunları / verileri değiştirmek için komut dosyaları çalıştırıyor. Ne yazık ki, komut dosyalarından biri önce işlevlerden birinin yerine getirilmesini gerektirir. Ancak önce tüm depolanan proc / işlev değişikliklerini çalıştıramıyorum çünkü ilk olarak tablolardan / sütunlardan / veri değişikliği komut dosyalarından eklenen sütunlara dayanıyor.

Saklı yordamlar ve işlevleri SQL Server işlev / SP tanımında kullanılan sütunları doğrulama olmadan çalıştırmak mümkün olup olmadığını merak ediyordum? Aramaya çalıştım ama bunu etkinleştirmek için bir koşul veya komut bulamadım.


Komut dosyalarınızda nesne oluşturmayı yeniden düzenlemeniz gerekebilir.
Thomas Stringer

@shark Değişiklik betiği, o anda bulunmayan bir işleve bağımlılık gerektiriyor ... bunu yapmak için manuel müdahale gerekiyordu; Daha otomatik bir şey istedim.
Brian Mains

Yanıtlar:


20

Henüz var olmayan nesnelere referansta bulunan saklı yordamlar oluşturabilirsiniz (örneğin, tablolar ve işlevler). Henüz varolan nesnelerde henüz bulunmayan sütunlara başvuran saklı yordamlar oluşturamazsınız. Bu, ertelenmiş ad çözümlemesinin çift kenarlı kılıcıdır - SQL Server, bazı durumlarda şüphenin avantajını sağlar, ancak hepsi değil. SET STRICT_CHECKS ON;Bunun çalıştığı yerler ve kırıldığı yerler hakkında fikir edinmek için Erland'ın fikirlerine bakın :

http://www.sommarskog.se/strict_checks.html

(Ve senin peşinde olduğun şeyin karşıt kutuplarını nasıl istediğini - varlığına bakılmaksızın her şeyin derlenmesine izin vermek istiyorsun ve her bir sütunun veya tablonun kontrol edilmesini istiyor.)

SET DEFERRED_NAME_RESOLUTION OFF;İstendiği gibi bir ayar yoktur :

http://connect.microsoft.com/sql/127152

Ve böyle bir ayar yok IGNORE ALL_RESOLUTION;.


Bunu aşağıdakiler de dahil olmak üzere birkaç şekilde çözebilirsiniz:

(a) etkilenen saklı yordam (lar) da dinamik SQL kullanın.

(b) CREATE PROCEDUREiçinde hiçbir şey olmayan bir saplama oluşturun , daha sonra komut dosyanızın geri kalanını çalıştırın, ardından ALTER PROCEDUREgerçek gövdeye sahip olanı çalıştırın (özünde prosedürü iki aşamada dağıtın).

(c) dağıtım aracınızı işlem sırası hakkında daha akıllı hale getirin. Tablo değişiklikleri bir işlevin varlığını gerektiriyorsa, bu değişiklikleri en son komut dosyasını yazın. RedGate'in SQL Compare gibi şema karşılaştırma araçları, uygun bağımlılık sırasında sizin için komut dosyaları oluşturma konusunda oldukça iyidir. Hangi aracı kullandığınızdan bahsetmezsiniz, ancak bunu yapmazsa ...

(d) Martin Smith'in burada ilginç bir çözümü var , ama onunla oynamadım.


Vay canına, Martin Smith kesmek harikulade zekidir. Şimdi kullanarak kirli hissediyorum, ama benim 20s olurdu.
John Zabroski

1

Önce söz konusu nesneyi silen veya yeniden adlandıran ve daha sonra orijinal saklı yordamınızı dinamik SQL olarak çalıştıran bir saklı yordam oluşturabilirsiniz. Bu şekilde, dinamik SQL kullanmak için gerçek saklı yordamı yeniden yazmak zorunda kalmazsınız.

Aşağıdaki kod, henüz var olmayan sütunlara başvuran saklı bir yordamı çalıştırır (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.