Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, SQL Server veritabanınızdaki kalıcı yapıların yükseltme uyumluluk düzeyinin bir parçası olarak nasıl doğrulanabileceği ve uyumluluk düzeyini yükselttikten sonra etkilenen yapıların nasıl yeniden oluşturulabileceği anlatılır.
Özgün ürün sürümü: SQL Server 2017, SQL Server 2016
Özgün KB numarası: 4010261
Microsoft SQL Server 2016 ve Azure SQL Veritabanı'daki veritabanı altyapısı, veri türü dönüştürmelerinde ve diğer birçok işlemde iyileştirmeler içerir. Bu geliştirmelerin çoğu, kayan nokta türleriyle ve klasik tarih saat türleriyle çalışırken daha fazla duyarlık sunar.
Bu iyileştirmelerin tümü, en az 130 veritabanı uyumluluk düzeyi kullandığınızda kullanılabilir. Bu, bazı (çoğunlukla yaygın olmayan) ifadelerde, veritabanını uyumluluk düzeyi 130 veya daha yüksek bir ayara yükseltdikten sonra bazı giriş değerleri için farklı sonuçlar görebileceğiniz anlamına gelir. Bu sonuçlar aşağıdakilere yansıtılabilir:
- veritabanında kalıcı yapılar
- kısıtlamalara
CHECK
tabi olan eklenen tablo verileri - kalıcı hesaplanan sütunlar
- hesaplanan sütunlara başvuran dizinler
- filtrelenmiş dizinler ve dizinlenmiş görünümler.
SQL Server'ın önceki bir sürümünde oluşturulmuş bir veritabanınız varsa, SQL Server 2016 veya sonraki bir sürümüne yükselttikten sonra ve veritabanı uyumluluk düzeyini değiştirmeden önce ek doğrulama yapmanızı öneririz.
Veritabanınızdaki kalıcı yapılardan herhangi birinin bu değişikliklerden etkilendiğini fark ederseniz, veritabanı uyumluluk düzeyini yükselttikten sonra etkilenen yapıları yeniden derlemenizi öneririz. Bunu yaparak SQL Server 2016 veya sonraki sürümlerdeki bu geliştirmelerden yararlanabilirsiniz.
Bu makalede, veritabanınızdaki kalıcı yapıların uyumluluk düzeyi 130 veya daha yüksek bir ayara yükseltmenin bir parçası olarak nasıl doğrulanabileceği ve uyumluluk düzeyini değiştirdikten sonra etkilenen yapıların nasıl yeniden oluşturulabileceği açıklanmaktadır.
Veritabanı uyumluluk düzeyine yükseltme sırasında doğrulama adımları
SQL Server 2016'dan başlayarak, hem SQL Server hem de Azure SQL Veritabanı aşağıdaki işlemlerin duyarlığında iyileştirmeler içerir:
- Yaygın olmayan veri türü dönüştürmeleri. Bunlar şunları içerir:
- Float/integer to/from datetime/smalldatetime
- Gerçek/kayan/sayısal/para/smallmoney
- Kayan gerçek
- ve ile ilgili
DATEPART
/DATEDIFF
bazı durumlarDEGREES
CONVERT
stilNULL
kullanan
Uygulamanızda ifade değerlendirmesinde bu iyileştirmeleri kullanmak için veritabanlarınızın uyumluluk düzeyini 130 (SQL Server 2016 için) veya 140 (SQL Server 2017 ve Azure SQL Veritabanı için) olarak değiştirin. Tüm değişiklikler hakkında daha fazla bilgi ve değişiklikleri gösteren bazı örnekler için Ek A bölümüne bakın.
Veritabanındaki aşağıdaki yapılar bir ifadenin sonuçlarını kalıcı hale gelebilir:
- Kısıtlamalara
CHECK
tabi tablo verileri - Kalıcı hesaplanan sütunlar
- Anahtarda veya dahil edilen sütunlarda hesaplanan sütunlar kullanan dizinler
- Filtrelenmiş dizinler
- Dizine alınan görünümler
Aşağıdaki senaryoyu değerlendirin:
SQL Server'ın önceki bir sürümü tarafından oluşturulmuş veya SQL Server 2016 veya sonraki bir sürümde oluşturulmuş ancak uyumluluk düzeyi 120 veya daha önceki bir düzeyde olan bir veritabanınız var.
Duyarlığı veritabanınızdaki kalıcı yapıların tanımı kapsamında geliştirilmiş tüm ifadeleri kullanırsınız.
Bu senaryoda, uyumluluk düzeyi 130 veya üzeri kullanılarak uygulanan duyarlık geliştirmeleri tarafından etkilenen kalıcı yapılarınız olabilir. Bu durumda kalıcı yapıları doğrulamanızı ve etkilenen tüm yapıları yeniden oluşturmanızı öneririz.
Etkilenen yapılarınız varsa ve uyumluluk düzeyini değiştirdikten sonra bunları yeniden oluşturamıyorsanız, biraz farklı sorgu sonuçlarıyla karşılaşabilirsiniz. Sonuçlar belirli bir dizinin, hesaplanan sütunun veya görünümün kullanılıp kullanılmadığına ve tablodaki verilerin kısıtlama ihlali olarak kabul edilip edilmeyeceğine bağlıdır.
Not
SQL Server'da İzleme Bayrağı 139
Genel izleme bayrağı 139, SQL Server 2016 CU3 ve Hizmet Paketi (SP) 1'de, DBCC CHECKTABLE
gibi DBCC CHECKDB
DBCC denetim komutları kapsamında doğru dönüştürme semantiğini zorlamak için ve DBCC CHECKCONSTRAINTS
daha önceki uyumluluk düzeyine sahip bir veritabanında uyumluluk düzeyi 130 ile sunulan geliştirilmiş duyarlığı ve dönüştürme mantığını analiz ettiğinizde kullanıma sunulmuştur.
Uyarı
İzleme bayrağı 139, üretim ortamında sürekli olarak etkinleştirilmek üzere tasarlanmamıştır ve yalnızca bu makalede açıklanan veritabanı doğrulama denetimlerini gerçekleştirmek için kullanılmalıdır. Bu nedenle, doğrulama denetimleri tamamlandıktan sonra aynı oturumda kullanılarak dbcc traceoff (139, -1)
devre dışı bırakılmalıdır.
İzleme bayrağı 139, SQL Server 2016 CU3 ve SQL Server 2016 SP1'den başlayarak desteklenir.
Uyumluluk düzeyini yükseltmek için şu adımları izleyin:
- Etkilenen kalıcı yapıları tanımlamak için doğrulama gerçekleştirin:
- komutunu çalıştırarak
DBCC TRACEON(139, -1)
139 izleme bayrağını etkinleştirin. CHECKCONSTRAINTS
ve komutlarını çalıştırınDBCC CHECKDB/TABLE
.- komutunu çalıştırarak
DBCC TRACEOFF(139, -1)
139 izleme bayrağını devre dışı bırakın.
- komutunu çalıştırarak
- Veritabanı uyumluluk düzeyini 130 (SQL Server 2016 için) veya 140 (SQL Server 2017 ve Azure SQL Veritabanı için) olarak değiştirin.
- 1. adımda tanımladığınız tüm yapıları yeniden oluşturun.
Not
İzleme bayraklarını ayarlama Azure SQL Veritabanı izleme bayrakları Azure SQL Veritabanı'da desteklenmez. Bu nedenle, doğrulama gerçekleştirmeden önce uyumluluk düzeyini değiştirmeniz gerekir:
- Veritabanı uyumluluk düzeyini 140'a yükseltin.
- Etkilenen kalıcı yapıları tanımlamak için doğrulayın.
- 2. adımda tanımladığınız yapıları yeniden oluşturun.
Ek A , tüm duyarlık iyileştirmelerinin ayrıntılı bir listesini içerir ve her biri için bir örnek sağlar.
Ek B , doğrulama yapmak ve etkilenen yapıları yeniden oluşturmak için ayrıntılı bir adım adım işlem içerir.
Ek C ve Ek D , veritabanında etkilenmiş olabilecek nesneleri saptamaya yardımcı olacak betikler içerir. Bu nedenle, doğrulamalarınızın kapsamını daraltabilir ve denetimleri çalıştırmak için karşılık gelen betikler oluşturabilirsiniz. Veritabanlarınızdaki kalıcı yapıların uyumluluk düzeyi 130'daki duyarlık geliştirmelerinden etkilenip etkilenmediğini en kolay şekilde belirlemek için, doğru doğrulama denetimlerini oluşturmak için Ek D'de betiği çalıştırın ve doğrulama yapmak için bu betiği çalıştırın.
Ek A: Uyumluluk düzeyindeki değişiklikler 130
Bu ek, uyumluluk düzeyi 130'da ifade değerlendirmesine yönelik iyileştirmelerin ayrıntılı listelerini sağlar. Her değişiklik ilişkili bir örnek sorgu içerir. Sorgular, uyumluluk düzeyi 130 kullanan bir veritabanına kıyasla 130 öncesi uyumluluk düzeyi kullanan bir veritabanında yürütme arasındaki farkları göstermek için kullanılabilir.
Aşağıdaki tablolarda veri türü dönüştürmeleri ve ek işlemler listelemektedir.
Veri türü dönüştürmeleri
Kaynak | Amaç | Değiştir | Örnek sorgu | Uyumluluk düzeyi < 130 sonucu | Uyumluluk düzeyi sonucu = 130 |
---|---|---|---|---|---|
float , real , numeric , decimal , , money veya smallmoney |
datetime veya smalldatetime |
Yuvarlama duyarlığı artırın. Daha önce gün ve saat ayrı ayrı dönüştürülüyordu ve siz birleştirmeden önce sonuçlar kesiliyordu. | DECLARE @f FLOAT = 1.2 DECLARE @d DATETIME = @f SELECT CAST(@d AS FLOAT) |
1.19999996141975 | 1.2 |
datetime |
bigint, int, or smallint |
Saat kısmı tam olarak yarım gün olan veya yarım günlük bir değer çizgisine sahip negatif bir tarih saat yanlış yuvarlanır (sonuç 1'e kadar kapalıdır). | DECLARE @h DATETIME = -0.5 SELECT @h, CAST(@h AS INT) |
0 | -1 |
datetime veya smalldatetime |
float, real, numeric, money, or smallmoney |
Bazı durumlarda son 8 bit duyarlık için geliştirilmiş duyarlık. | DECLARE @p0 DATETIME = '1899-12-31 23:58:00.470' DECLARE @f FLOAT = CONVERT(FLOAT, @p0) SELECT @f, CAST(@f AS VARBINARY(8)) |
-0,00138344907407406, 0xBF56AA9B21D85800 | -0,00138344907407407, 0xBF56AA9B21D8583B |
float |
real |
Sınır denetimleri daha az katıdır. | SELECT CAST (3.40282347000E+038 AS REAL) |
Aritmetik taşma | 3.402823E+38 |
numeric , money ve smallmoney |
float |
Giriş ölçeği sıfır olduğunda, sayısalın dört bölümünü birleştirdiğinizde yuvarlama kararsızı olur. | DECLARE @n NUMERIC(38, 0)= 41538374868278625639929991208632320 DECLARE @f FLOAT = CAST(@n AS FLOAT) SELECT CONVERT(BINARY(8), @f) |
0x4720000000000000 | 0x4720000000000001 |
numeric , money ve smallmoney |
float |
Giriş ölçeği sıfırdan farklı olduğunda, 10^ölçeğe böldüğünüzde bir yuvarlama kesinlik olur. | DECLARE @n NUMERIC(18, 10) = 12345678.0123456781 DECLARE @f FLOAT = CAST(@n AS FLOAT) SELECT CAST(@f AS BINARY(8)) |
0x41678C29C06522C4 | 0x41678C29C06522C3 |
real veya float |
sayısal | Bazı durumlarda iyileştirilmiş yuvarlama duyarlığı. | DECLARE @f float = 0.14999999999999999 SELECT CAST(@f AS numeric(1, 1)) |
0,2 | 0,1 |
real veya float |
sayısal | Bazı durumlarda 16'dan fazla basamağı yuvarladığınızda duyarlık geliştirildi. | DECLARE @v decimal(38, 18) = 1E-18 SELECT @v |
0.000000000000000000 | 0.000000000000000001 |
real veya float |
money veya smallmoney |
Bazı durumlarda büyük sayıları dönüştürürken doğruluk iyileştirildi. | DECLARE @f float = 2SET @f = POWER(@f, 49) + POWER(@f, -2) SELECT CAST(@f AS money) |
562949953421312.2048 | 562949953421312.25 |
(n)(var)char |
numeric |
39 karakterden uzun bir giriş artık aritmetik taşma tetiklemez. | DECLARE @value nchar(100) = '1.11111111111111111111111111111111111111' SELECT CAST(@value AS decimal(2,1)) |
Aritmetik taşma | 1.1 |
(n)(var)char |
bit |
Öndeki boşlukları ve işaretleri destekler. | DECLARE @value nvarchar(100) = '1' SELECT CAST(@value AS bit) |
'1' değeri veri türü bitine dönüştürülürken nvarchar dönüştürme başarısız oldu. |
1 |
datetime |
time veya datetime2 |
Daha yüksek duyarlıklı tarih/saat türlerine dönüştürdüğünüzde geliştirilmiş duyarlık. Tarih saat değerlerinin saniyenin 300'ünde 1/1'ini temsil eden keneler olarak depolandığını unutmayın. Daha yeni saat ve datetime2 türleri, basamak sayısının duyarlıkla eşleştiği ayrı basamak sayısını depolar. | DECLARE @value datetime = '1900-01-01 00:00:00.003' SELECT CAST(@value AS time(7)) |
00:00:00.0030000 | 00:00:00.0033333 |
time veya datetime2 |
datetime |
Bazı durumlarda yuvarlama iyileştirildi. | DECLARE @value time(4) = '00:00:00.0045' SELECT CAST(@value AS datetime) |
1900-01-01 00:00:00.007 | 1900-01-01 00:00:00.003 |
İşlem
İşlem | Değiştir | Örnek sorgu | Uyumluluk düzeyi <130 sonucu | Uyumluluk düzeyi 130 sonucu |
---|---|---|---|---|
RADIANS Sayısal veri türünü kullanan veya DEGREES yerleşik işlevini kullanın. |
DEGREES daha önce 180/pi ile çarpıldığı pi/180'e bölünür. için RADIANS benzer. |
DECLARE @arg1 numeric = 1 SELECT DEGREES(@arg1) |
57.295779513082323000 | 57.295779513082322865 |
Bir işlenenin ölçeği sonucun ölçeğinden büyük olduğunda sayısal toplama veya çıkarma. | Yuvarlama her zaman toplama veya çıkarmadan sonra gerçekleşirken, daha önce bazen daha önce gerçekleşebilirdi. | DECLARE @p1 numeric(38, 2) = -1.15 DECLARE @p2 numeric(38, 1) = 10 SELECT @p1 + @p2 |
8.8 | 8.9 |
CONVERT stile sahip NULL . |
CONVERT stiliyle, NULL hedef tür sayısal olduğunda her zaman döndürür NULL . |
SELECT CONVERT (SMALLINT, '0', NULL); |
0 | NULL |
DATEPART tarih saat veri türüyle birlikte mikrosaniye veya nanosaniye seçeneğini kullanır. |
Değer artık mikro veya nanosaniyeye dönüştürülmeden önce milisaniye düzeyinde kesilmez. | DECLARE @dt DATETIME = '01-01-1900 00:00:00.003'; SELECT DATEPART(MICROSECOND, @dt); |
3000 | 3333 |
DATEDIFF tarih saat veri türüyle birlikte mikrosaniye veya nanosaniye seçeneğini kullanır. |
Değer artık mikro veya nanosaniyeye dönüştürülmeden önce milisaniye düzeyinde kesilmez. | DECLARE @d1 DATETIME = '1900-01-01 00:00:00.003' DECLARE @d2 DATETIME = '1900-01-01 00:00:00.007' SELECT DATEDIFF(MICROSECOND, @d1, @d2) |
3000 | 3333 |
Milisaniye için sıfır olmayan değerlerle datetime ve datetime2 değerleri arasında karşılaştırma. | Datetime2 değeriyle karşılaştırma çalıştırdığınızda, tarih saat değeri artık milisaniye düzeyinde kesilmemektedir. Bu, daha önce eşit olan belirli değerlerin artık eşit olmadığı anlamına gelir. | DECLARE @d1 DATETIME = '1900-01-01 00:00:00.003' DECLARE @d2 DATETIME2(3) = @d1 SELECT CAST(@d1 AS datetime2(7)), @d2SELECT CASE WHEN (@d1=@d2) THEN 'equal' ELSE 'unequal' END |
1900-01-01 00:00:00.0030000, 1900-01-01 00:00:00.003 eşittir | 1900-01-01 00:00:00.0033333, 1900-01-01 00:00:00.003 eşit değil |
ROUND veri türünü kullanan float işlev. |
Yuvarlama sonuçları farklıdır. | SELECT ROUND(CAST (-0.4175 AS FLOAT), 3) |
-0.418 | -0.417 |
Ek B: Kalıcı yapıları doğrulama ve güncelleştirme adımları
Veritabanının uyumluluk düzeyi 130'daki değişikliklerden etkilenen kalıcı yapılara sahip olup olmadığını belirlemenizi ve etkilenen yapıları yeniden oluşturmanızı öneririz.
Bu yalnızca SQL Server'ın eski bir sürümünde veya 130'dan düşük bir uyumluluk düzeyi kullanılarak veritabanında oluşturulan kalıcı yapılar için geçerlidir. Olası olarak etkilenen kalıcı yapılar şunlardır:
- Kısıtlamalara
CHECK
tabi tablo verileri - Kalıcı hesaplanan sütunlar
- Anahtarda veya dahil edilen sütunlarda hesaplanan sütunlar kullanan dizinler
- Filtrelenmiş dizinler
- Dizine alınan görünümler
Bu durumda aşağıdaki yordamı çalıştırın.
1. Adım: Veritabanı uyumluluk düzeyini doğrulama
- Veritabanını görüntüleme veya veritabanının uyumluluk düzeyini değiştirme bölümünde belgelenen yordamı kullanarak veritabanınızın uyumluluk düzeyini denetleyin.
- Veritabanı uyumluluk düzeyi 130'dan düşükse, uyumluluk düzeyini 130'a yükseltmeden önce 2. Adımda açıklanan doğrulamayı gerçekleştirmenizi öneririz.
2. Adım: Etkilenen kalıcı yapıları tanımlama
Veritabanının, uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığından etkilenen kalıcı yapılar içerip içermediğini aşağıdaki şekilde belirleyin:
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
, veritabanındaki tüm yapıları doğrular.DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS
, tek bir tabloyla ilgili yapıları doğrular.
Kalıcı değerlerin hesaplanan değerlerle karşılaştırıldığından emin olmak ve fark olan durumlara bayrak eklemek için bu seçenek WITH EXTENDED_LOGICAL_CHECKS
gereklidir. Bu denetimler kapsamlı olduğundan, bu seçeneği kullanan deyimlerin DBCC
çalışma zamanı, deyimleri seçenek olmadan çalıştırmaktan DBCC
daha uzundur. Bu nedenle, büyük veritabanları için tek tek tabloları saptamak için kullanılması DBCC CHECKTABLE
önerilmektedir.
DBCC CHECKCONSTRAINTS
kısıtlamaları doğrulamak CHECK
için kullanılabilir. Bu deyim, veritabanında veya tablo düzeyinde kullanılabilir.
DBCC CHECK
denetimlerin çevrimiçi iş yükü üzerindeki olası etkisi nedeniyle deyimler her zaman bakım penceresi sırasında çalıştırılmalıdır.
Veritabanı düzeyinde doğrulama
Veritabanı düzeyinde doğrulama, küçük ve orta büyüklükteki veritabanları için uygundur. Büyük veritabanları için tablo düzeyinde doğrulamayı kullanın.
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
, veritabanındaki tüm kalıcı yapıları doğrulamak için kullanılır.
DBCC CHECKCONSTRAINTS
, veritabanındaki tüm CHECK
kısıtlamaları doğrulamak için kullanılır.
DBCC CHECKCONSTRAINTS
kısıtlamaların bütünlüğünü doğrulamak için kullanılır. Veritabanını doğrulamak için aşağıdaki betiği kullanın:
USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKCONSTRAINTS
GO
DBCC TRACEOFF(139, -1)
GO
İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile doğru dönüştürme semantiğini zorlar.
CHECKCONSTRAINTS
Deyimi tamamlandıysa ve sonuç kümesi döndürmezse ek bir eylem gerekmez.
Deyimi bir sonuç kümesi döndürmezse, sonuçlardaki her satır kısıtlama ihlalini gösterir ve ayrıca kısıtlamayı ihlal eden değerleri de içerir.
- Tabloların ve kısıtlamaların adlarını, ihlale neden olan değerlerle (
WHERE
sonuç kümesindeki sütun) birlikte kaydedin.
Aşağıdaki örnekte kısıtlaması olan bir CHECK
tablo ve daha düşük uyumluluk düzeyleri altında kısıtlamayı karşılayan ancak uyumluluk düzeyi 130'un altındaki kısıtlamayı ihlal eden tek bir satır gösterilmektedir.
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table1
(
c2 datetime,
c3 datetime,
c4 int,
CONSTRAINT chk1 CHECK (c4= (DATEDIFF (ms, c2,c3)))
)
GO
INSERT dbo.table1 (c2, c3, c4) VALUES
(
convert(datetime, '1900-01-01 00:00:00.997'),
convert(datetime, '1900-01-01 00:00:01'), 3
)
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKCONSTRAINTS
GO
DBCC TRACEOFF(139, -1)
GO
komutu CHECKCONSTRAINT
aşağıdaki sonuçları döndürür.
Tablo | Kısıtlama | Konumu |
---|---|---|
[dbo]. [tablo1] | [chk1] | [c2] = '1900-01-01 00:00.997' AND [c3] = '1900-01-01 00:00:01.000' AND [c4] = '3' |
Bu sonuç, [chk1] kısıtlamasının 'Where' içindeki sütun değerlerinin birleşimi için ihlal edildiğine işaret eder.
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS
veritabanındaki tüm kalıcı yapıları doğrular. Tek bir deyim veritabanındaki tüm yapıları doğruladığı için bu en uygun seçenektir. Ancak, deyiminin beklenen çalışma zamanı nedeniyle bu seçenek büyük veritabanları için uygun değildir.
Veritabanının tamamını doğrulamak için aşağıdaki betiği kullanın:
USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS
GO
DBCC TRACEOFF(139, -1)
GO
İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile doğru dönüştürme semantiğini zorlar.
CHECKDB
Deyimi başarıyla tamamlanırsa ek bir eylem gerekmez.
deyimi hatalarla tamamlandıysa şu adımları izleyin:
- SQL Server Management Studio'daki (SSMS) iletiler bölmesinde bulunan deyiminin
DBCC
yürütülmesinden elde edilen sonuçları bir dosyaya kaydedin. - Bildirilen hatalardan herhangi birinin kalıcı yapılara ilişkin olduğunu doğrulayın
Tablo 1: Tutarsızlıklar için kalıcı yapılar ve ilgili hata iletileri
Yapı türü etkilendi | Gözlemlenen hata iletileri | Not alın |
---|---|---|
Kalıcı hesaplanan sütunlar | Msg 2537, Düzey 16 Tablo hatası: nesne kimliği <object_id> , dizin kimliği <index_id> , . Kayıt denetimi (geçerli hesaplanan sütun) başarısız oldu. Değerler şeklindedir. | nesne kimliği <object_id> ve dizin kimliği <index_id> |
Anahtardaki hesaplanan sütunlara veya eklenen sütunlara başvuran dizinler Filtrelenmiş dizinler | Msg 8951 Tablo hatası: '<table_name>' tablosu (kimlik <object_id>). Veri satırının '<index_name>' dizininde eşleşen bir dizin satırı yok (Kimlik <index_id>) Ve/veya 8952 Msg 8952 Tablo hatası: tablo '<table_name>' (Kimlik <table_name>). '' dizinindeki dizin satırı (Kimlik <index_id>) hiçbir veri satırıyla eşleşmiyor. Ayrıca, 8955 ve/veya 8956 ikincil hataları olabilir. Bu, etkilenen tam satırlarla ilgili ayrıntıları içerir. Bunlar bu alıştırma için göz ardı edilebilir. | nesne kimliği <object_id> ve dizin kimliği <index_id> |
Dizine alınan görünümler | Msg 8908 Dizinli '<view_name>' görünümü (nesne kimliği <object_id>), görünüm tanımının ürettiği tüm satırları içermez. Ve/veya Msg 8907 Dizine alınan '<view_name>' görünümü (nesne kimliği <object_id>), görünüm tanımı tarafından üretilmeyen satırları içerir. | nesne kimliği <object_id> |
Veritabanı düzeyinde doğrulamayı tamamladıktan sonra 3. Adım'a gidin.
Nesne düzeyinde doğrulama
Daha büyük veritabanları için, bakım pencerelerinin boyutunu küçültmek veya genişletilmiş mantıksal denetimleri yalnızca etkilenmiş olabilecek nesnelerle sınırlamak için bir tablodaki veya bir kerede bir görünümdeki yapıları ve kısıtlamaları doğrulamak yararlı olur.
Etkilenen olası tabloları belirlemek için Ek C bölümündeki sorguları kullanın. Ek D bölümündeki betik, Ek C bölümünde listelenen sorgulara göre ve CHECKCONSTRAINTS
kısıtlamaları oluşturmak CHECKTABLE
için kullanılabilir.
DBCC CHECKCONSTRAINTS
Tek bir tablo veya görünümle ilgili kısıtlamaları doğrulamak için aşağıdaki betiği kullanın:
USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKCONSTRAINTS()
GO
DBCC TRACEOFF(139, -1)
GO
İzleme bayrağının kullanılması, denetimlerin uyumluluk düzeyi 130'daki geliştirilmiş duyarlık ve dönüştürme mantığı kullanılarak gerçekleştirilmesini sağlar ve veritabanı daha düşük uyumluluk düzeyine sahip olsa bile geliştirilmiş semantiği zorlar.
CHECKCONSTRAINTS
Deyimi tamamlandıysa ve sonuç kümesi döndürmezse ek bir eylem gerekmez.
Deyimi bir sonuç kümesi döndürmezse, sonuçlardaki her satır kısıtlama ihlalini gösterir ve ayrıca kısıtlamayı ihlal eden değerleri sağlar.
Tabloların ve kısıtlamaların adlarını, ihlale neden olan değerlerle ( WHERE
sonuç kümesindeki sütun) birlikte kaydedin.
DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS
Tek bir tablo veya görünümle ilgili kalıcı yapıları doğrulamak için aşağıdaki betiği kullanın:
USE [database_name]
GO
DBCC TRACEON(139, -1)
GO
DBCC CHECKTABLE() WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS
GO
DBCC TRACEOFF(139, -1)
GO
CHECKTABLE
Deyimi başarıyla tamamlanırsa ek bir eylem gerekmez.
deyimi hatalarla tamamlandıysa şu adımları izleyin:
- SSMS'deki iletiler bölmesinde bulunan deyiminin
DBCC
yürütülmesinden elde edilen sonuçları bir dosyaya kaydedin. - Bildirilen hatalardan herhangi birinin Tablo 1'de listelenen kalıcı yapılara ilişkin olduğunu doğrulayın.
- Tablo düzeyi doğrulamayı tamamladıktan sonra 3. Adım'a gidin.
3. Adım: Uyumluluk düzeyi 130'a yükseltme
Veritabanının uyumluluk düzeyi zaten 130 ise, bu adımı atlayabilirsiniz.
Aşağıdaki betik kullanılarak veritabanının uyumluluk düzeyi 130 olarak değiştirilebilir:
USE [database_name]
GO
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130
GO
Not
Uyumluluk düzeyi 130'un altında sorgu iyileştirici değişiklikleri olduğundan, uyumluluk düzeyini değiştirmeden önce sorgu deposunu etkinleştirmenizi öneririz. Daha fazla bilgi için Sorgu Deposu Kullanım Senaryoları'nın Daha yeni SQL Server'a yükseltme sırasında performans kararlılığını koruma bölümüne bakın.
4. Adım: Kalıcı yapıları güncelleştirme
2. Adımda gerçekleştirilen doğrulama sırasında tutarsızlık bulunmadıysa, yükseltme işleminiz tamamlanır ve bu adımı atlayabilirsiniz. 2. Adım'da tutarsızlıklar bulunduysa, tutarsızlıkları veritabanından kaldırmak için ek eylemler gerekir. Gerekli eylemler, etkilenen yapı türüne bağlıdır.
Önemli
Bu adımda onarım eylemlerini yalnızca veritabanı uyumluluk düzeyi 130 olarak değiştirildikten sonra gerçekleştirin.
Veritabanınızı (veya veritabanlarını) yedekleme
Aşağıdaki bölümde açıklanan eylemlerden herhangi birini gerçekleştirmeden önce tam veritabanı yedeklemesi yapmanızı öneririz. Azure SQL Veritabanı kullanıyorsanız, kendiniz yedeklemeniz gerekmez; güncelleştirmelerden herhangi birinde bir sorun olması durumunda zaman içinde geri dönmek için her zaman belirli bir noktaya geri yükleme işlevini kullanabilirsiniz.
CHECK kısıtlamaları
Kısıtlama ihlallerinin düzeltilmesi CHECK
için tablodaki verilerin veya kısıtlamanın CHECK
kendisinin değiştirilmesi gerekir.
Kısıtlamanın adından (2. Adımda elde edilen) kısıtlama tanımını aşağıdaki gibi alabilirsiniz:
SELECT definition FROM sys.check_constraints
WHERE object_id= OBJECT_ID(N'constraint_name')
Etkilenen tablo satırlarını incelemek için, deyimi tarafından DBCC CHECKCONSTRAINTS
daha önce döndürülen Where bilgilerini kullanabilirsiniz:
SELECT *
FROM [schema_name].[table_name]
WHERE Where_clause
Kısıtlamanın ihlal olmadığından emin olmak için etkilenen satırları güncelleştirmeniz veya kısıtlama tanımını değiştirmeniz gerekir.
Tablo verilerini güncelleştirme
Verilerin nasıl güncelleştirilmesi gerektiğini belirten kesin bir kural yoktur. Genel olarak, tarafından DBCC CHECKCONSTRAINTS
döndürülen her farklı Where deyimi için aşağıdaki güncelleştirme deyimini çalıştırırsınız:
UPDATE [schema_name].[table_name] SET new_column_values
WHERE Where_clause
Uyumluluk düzeyi 130'da kısıtlamayı ihlal eden bir kısıtlama ve satır içeren aşağıdaki örnek tabloyu göz önünde bulundurun:
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table1
(
c2 datetime,
c3 datetime,
c4 int,
CONSTRAINT chk1 CHECK (c4= (DATEDIFF (ms, c2, c3)))
)
GO
INSERT dbo.table1 (c2, c3, c4) VALUES
(convert(datetime, '1900-01-01 00:00:00.997'),
convert(datetime, '1900-01-01 00:00:01'), 3)
GO
Bu örnekte kısıtlama basittir. Sütunc4
, ve c3
içeren c2
bir ifadeye eşit olmalıdır. Tabloyu güncelleştirmek için bu değeri öğesine atayın c4
:
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130
GO
UPDATE dbo.table1 SET c4 = datediff (ms, c2,c3)
WHERE [c2] = '1900-01-01 00:00:00.997' AND [c3] = '1900-01-01 00:00:01.000' AND [c4] = '3'
GO
WHERE
update deyiminde kullanılan yan tümcesinin tarafından DBCC CHECKCONSTRAINTS
döndürülen Where bilgilerine karşılık olduğuna dikkat edin.
CHECK kısıtlaması güncelleştiriliyor
Bir CHECK
kısıtlamayı değiştirmek için bırakmanız ve yeniden oluşturmanız gerekir. Güncelleştirilmiş kısıtlama tanımıyla ilgili herhangi bir sorun olması durumunda her ikisini de aynı işlemde yapmanızı öneririz. Aşağıdaki Transact-SQL'i kullanabilirsiniz:
BEGIN TRANSACTION
ALTER TABLE [schema_name].[table_name]
DROP CONSTRAINT [constraint_name]
ALTER TABLE [schema_name].[table_name]
ADD CONSTRAINT [constraint_name]
CHECK (new_constraint_definition)
COMMIT
GO
The following example updates the constraint chk1 in dbo.table1:
BEGIN TRANSACTION
ALTER TABLE dbo.table1
DROP CONSTRAINT chk1
ALTER TABLE dbo.table1
ADD CONSTRAINT chk1
CHECK (c4 <= DATEDIFF (ms, c2, c3))
COMMIT
GO
Kalıcı hesaplanan sütunlar
Kalıcı hesaplanan sütunları güncelleştirmenin en kolay yolu, hesaplanan sütun tarafından başvuruda bulunan sütunlardan birini güncelleştirmektir. Sütunun yeni değeri eski değerle aynı olabilir, böylece işlem herhangi bir kullanıcı verisini değiştirmez.
2. Adımda not ettiğiniz hesaplanan sütunlardaki tutarsızlıklarla ilgili her object_id
şey için bu adımları izleyin.
Hesaplanan sütunları tanımlama:
Belirtilen için tablo adını ve kalıcı hesaplanan sütunların adlarını almak için aşağıdaki sorguyu
object_id
çalıştırın:SELECT QUOTENAME(s.name) + N'.' + QUOTENAME(t.name) AS 'table', QUOTENAME(c1.name) AS 'persisted computed column', c1.column_id AS 'computed_column_id' , definition AS 'computed_column_definition' FROM sys.tables t JOIN sys.computed_columns c1 ON t.object_id=c1.object_id AND c1.is_persisted=1 JOIN sys.schemas s ON t.schema_id=s.schema_id WHERE t.object_id=object_id
Başvurulan sütunları tanımlama:
Hesaplanan sütun tarafından başvuruda bulunan sütunları tanımlamak için aşağıdaki sorguyu çalıştırın. Başvuruda bulunılan sütun adlarından birini not edin:
SELECT QUOTENAME(s.name) + N'.' + QUOTENAME(o.name) AS 'referencing object', o.type_desc AS 'object type', referenced_minor_id AS 'referenced_column_id', c.name AS 'referenced_column_name' FROM sys.sql_expression_dependencies sed JOIN sys.computed_columns c1 ON sed.referencing_id=c1.object_id AND sed.referencing_minor_id=c1.column_id JOIN sys.objects o ON sed.referencing_id=o.object_id JOIN sys.schemas s ON o.schema_id=s.schema_id JOIN sys.columns c ON o.object_id=c.object_id AND sed.referenced_minor_id=c.column_id WHERE referencing_class=1 AND referenced_class=1 AND referencing_id=object_id AND referencing_minor_id=computed_column_id
UPDATE
Hesaplanan sütunun güncelleştirmesini tetikleme amacıyla başvuruda bulunan sütunlardan birini içeren bir deyim çalıştırın:Aşağıdaki deyim, hesaplanan sütun tarafından başvuruda bulunan sütunun güncelleştirmesini ve ayrıca hesaplanan sütunun güncelleştirmesini tetikler.
UPDATE [schema_name].[table_name] SET referenced_column_name=ISNULL(referenced_column_name, referenced_column_name)
ISNULL
deyimindeki ifade, özgün sütunun değeri değiştirilmeyecek şekilde oluşturulur ve yine de hesaplanan sütunun VERITABANı uyumluluk düzeyi 130 ifade değerlendirme mantığı kullanılarak güncelleştirildiğinden emin olur.Çok büyük tablolar için tek bir işlemdeki tüm satırları güncelleştirmek istemeyebilirsiniz. Böyle bir durumda, güncelleştirme deyimine bir satır aralığını tanımlayan bir
WHERE
yan tümce ekleyerek, örneğin birincil anahtarı temel alarak güncelleştirmeyi toplu olarak çalıştırabilirsiniz.
Hesaplanan sütuna başvuran dizinleri tanımlayın.
SELECT i.name AS [index name] FROM sys.index_columns ic JOIN sys.indexes i ON ic.object_id=i.object_id AND ic.index_id=i.index_id WHERE i.object_id=object_id AND ic.column_id=computed_column_id
Bu sorgu, kalıcı hesaplanan sütuna başvuran tüm dizinleri tanımlar. Bu tür dizinlerin yeniden oluşturulması gerekir. Bunu yapmak için aşağıdaki bölümdeki adımları izleyin.
Dizinler, filtrelenmiş dizinler ve dizinlenmiş görünümler
Dizinlerdeki tutarsızlıklar, Adım 2'deki çıktıda 8951 ve 8952 (tablolar için) veya 8907 ve 8908 (görünümler için) DBCC CHECK
hatalarına karşılık gelir.
Bu tutarsızlıkları onarmak için ile REPAIR_REBUILD
komutunu çalıştırınDBCC CHECKTABLE
. Bu, dizin yapılarını veri kaybı olmadan onaracaktır. Ancak, veritabanı tek kullanıcı modunda olmalıdır ve bu nedenle onarım sırasında diğer kullanıcılar tarafından kullanılamaz.
Ayrıca etkilenen dizinleri el ile yeniden oluşturabilirsiniz. Dizin yeniden oluşturma bir ÇEVRİmİÇİ işlem olarak (DESTEKLENEN SQL Server sürümlerinde) gerçekleştirilebildiğinden, iş yükü çevrimdışına alınamıyorsa bu seçenek kullanılmalıdır.
Dizinleri yeniden oluşturma
Veritabanını tek kullanıcı modunda ayarlamak bir seçenek değilse, 2. Adımda tanımlanan her dizin için kullanarak ALTER INDEX REBUILD
dizinleri tek tek yeniden oluşturabilirsiniz.
Verilen object_id
ve index_id
için tablo ve dizin adlarını almak için aşağıdaki sorguyu kullanın.
SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'table', i.name AS 'index_name'
FROM sys.objects o JOIN sys.indexes i ON o.object_id=i.object_id
WHERE o.object_id = object_id AND i.index_id = index_id
Dizini yeniden oluşturmak için aşağıdaki deyimi kullanın:
ALTER INDEX index_name ON [schema_name].[table_name] REBUILD WITH (ONLINE=ON)
Not
Standart, Web veya Express sürümleri kullanıyorsanız çevrimiçi dizin derlemesi desteklenmez. Bu nedenle, seçeneği WITH (ONLINE=ON)
deyiminden ALTER INDEX
kaldırılmalıdır.
Aşağıdaki örnekte filtrelenmiş dizinin yeniden oluşturulması gösterilmektedir:
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=120
GO
CREATE TABLE dbo.table2
(
c2 datetime,
c3 float
)
GO
INSERT dbo.table2 (c2,c3) VALUES ('1899-12-31 23:58:00.470', -0.00138344907407406)
GO
CREATE INDEX ix_1 ON dbo.table2(c2)
WHERE (c2=-0.00138344907407406)
GO
ALTER DATABASE CURRENT SET COMPATIBILITY_LEVEL=130GOALTER INDEX ix_1 ON [dbo].[table2] REBUILD WITH (ONLINE=ON)
GO
Düzenli bakım planlarınız varsa, zamanlanmış bakımınızın bir parçası olarak bu dizin yeniden derlemesini eklemenizi öneririz.
DBCC kullanarak onarma
2. Adımda not ettiğiniz tutarsızlıkları olan bir dizinle ilgili her (object_id) için onarımı gerçekleştirmek için aşağıdaki betiği çalıştırın. Bu betik, veritabanını onarım işlemi için tek kullanıcılı modda ayarlar. En kötü durumda, onarım tam bir dizin yeniden oluşturma işlemi gerçekleştirir.
USE [database_name]
GO
ALTER DATABASE CURRENT SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
DBCC CHECKTABLE (object_id, REPAIR_REBUILD) WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS
GO
ALTER DATABASE CURRENT SET MULTI_USER
GO
Ek C: Aday tablolarını tanımlamak için sorgular
Aşağıdaki betikler, uyumluluk düzeyi 130'daki iyileştirmelerden etkilenen veri türlerini kullanan kalıcı yapıların ve kısıtlamaların varlığına bağlı olarak kullanarak doğrulamak DBCC CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS
isteyebileceğiniz aday tabloları tanımlar.
Aşağıdaki sorgu kümesi, tablolar ve ek doğrulama gerektiren olası etkilenen yapılar hakkındaki ayrıntıları listeler.
Dizine alınan görünümler
Aşağıdaki sorgu, etkilenen veri türlerini veya etkilenen yerleşik işlevlerden herhangi birini kullanarak sütunlara başvuran tüm dizinlenmiş görünümleri döndürür:
SELECT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'view', QUOTENAME(i.name) AS 'index',QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'referenced table', QUOTENAME(c.name) AS 'referenced column', t.name AS 'data type',
-- if the data type is numeric, integer, or money, the only cases that warrent additional checks
-- with DBCC is if the view definition contains a float or datetime value, or a conversion to such value
s.definition
FROM sys.sql_expression_dependencies sed
JOIN sys.objects o ON sed.referencing_id = o.object_id AND o.type=N'V'
JOIN sys.indexes i ON o.object_id=i.object_id
JOIN sys.sql_modules s ON s.object_id=o.object_id
JOIN sys.columns c ON sed.referenced_id=c.object_id AND sed.referenced_minor_id=c.column_idJOIN sys.types t ON c.system_type_id=t.system_type_id
WHERE referencing_class=1 AND referenced_class=1 AND (c.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
) OR s.[definition] LIKE '%DATEDIFF%'
OR s.[definition] LIKE '%CONVERT%'
OR s.[definition] LIKE '%CAST%'
OR s.[definition] LIKE '%DATEPART%'
OR s.[definition] LIKE '%DEGREES%')
Kalıcı hesaplanan sütunlar
Aşağıdaki sorgu, etkilenen veri türlerini kullanarak veya bir dizinden sütunun kalıcı olduğu veya başvurulduğu etkilenen yerleşik işlevlerden herhangi birini kullanarak diğer sütunlara başvuran hesaplanan sütunlara sahip tüm tabloları döndürür.
SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +
QUOTENAME(sed.referenced_entity_name) AS 'candidate table with computed column',
QUOTENAME(c1.name) AS 'computed column', c1.is_persisted,QUOTENAME(c2.name) AS 'referenced column', t.name AS 'data type',
-- if the data type is numeric, integer, or money, the only cases that warrent additional checks
-- with DBCC is if the column definition contains a float or datetime value, or a conversion to such value
c1.definition
FROM sys.sql_expression_dependencies sed
JOIN sys.computed_columns c1 ON sed.referencing_id=c1.object_id AND sed.referencing_minor_id=c1.column_id
JOIN sys.columns c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id=c2.column_id
JOIN sys.types t ON c2.system_type_id=t.system_type_idWHERE referencing_class=1 AND referenced_class=1
AND (c2.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
) OR c1.[definition] LIKE '%DATEDIFF%'
OR c1.[definition] LIKE '%CONVERT%'
OR c1.[definition] LIKE '%DATEPART%'
OR c1.[definition] LIKE '%DEGREES%')
AND (
-- the column is persisted
c1.is_persisted=1
-- OR the column is included in an index
OR EXISTS (SELECT 1 FROM sys.index_columns ic WHERE ic.object_id=c1.object_id AND ic.column_id=c1.column_id)
)
Filtrelenmiş dizinler
Aşağıdaki sorgu, etkilenen veri türlerine sahip filtre koşulundaki sütunlara başvuran filtrelenmiş dizinlere sahip tüm tabloları döndürür:
SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +
QUOTENAME(sed.referenced_entity_name) AS 'candidate table with filtered index',
QUOTENAME(i.name) AS 'referencing index',
QUOTENAME(c.name) AS 'referenced column',
t.name AS 'data type',
-- if the data type is numeric, integer, or money, the only cases that warrent additional checks
-- with DBCC is where the filter condition contains a float or datetime value
i.filter_definition AS 'filter condition'
FROM sys.sql_expression_dependencies sed
JOIN sys.indexes i ON sed.referencing_id=i.object_id AND sed.referencing_minor_id=i.index_id
JOIN sys.columns c ON sed.referenced_id=c.object_id AND sed.referenced_minor_id=c.column_id
JOIN sys.types t ON c.system_type_id=t.system_type_id
WHERE referencing_class=7 AND referenced_class=1 AND i.has_filter=1
AND c.system_type_id IN ( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
)
Kısıtlamaları denetleme
Aşağıdaki sorgu, etkilenen veri türlerine veya yerleşik işlevlere başvuran denetim kısıtlamaları olan tüm tabloları listeler:
SELECT QUOTENAME(sed.referenced_schema_name) + N'.' +
QUOTENAME(sed.referenced_entity_name) AS 'candidate table with check constraint',
QUOTENAME(c.name) AS 'constraint_name', c.definition AS 'constraint_definition',
QUOTENAME(col.name) AS 'referenced column', t.name AS 'data type'
FROM sys.sql_expression_dependencies sed
JOIN sys.check_constraints c ON sed.referencing_id=c.object_id AND sed.referencing_class=1
JOIN sys.columns col ON sed.referenced_id=col.object_id AND sed.referenced_minor_id=col.column_id
JOIN sys.types t ON col.system_type_id=t.system_type_id
WHERE referencing_class=1 AND referenced_class=1 AND (col.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint)
OR c.[definition] LIKE '%DATEDIFF%'
OR c.[definition] LIKE '%CONVERT%'
OR c.[definition] LIKE '%DATEPART%'
OR c.[definition] LIKE '%DEGREES%')
Ek D: CHECK* deyimleri oluşturmak için betik
Aşağıdaki betik, önceki ekteki sorguları birleştirir ve ve CHECKTABLE
deyimleri biçiminde CHECKCONSTRAINTS
tabloların ve görünümlerin listesini sunarak sonuçları basitleştirir.
DECLARE @CRLF nvarchar(10) = CHAR(13) + CHAR(10);
DECLARE @sql nvarchar(max) = N'DBCC TRACEON(139,-1); ' + @CRLF ;
SELECT @sql += N'DBCC CHECKTABLE (N''' + object_for_checktable + N''') WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS; ' + @CRLF
FROM
(
--indexed views
SELECT DISTINCT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id AND o.type = N'V'
INNER JOIN sys.indexes AS i ON o.object_id = i.object_id
INNER JOIN sys.sql_modules AS s ON s.object_id = o.object_id
INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE referencing_class = 1 AND referenced_class=1
AND (c.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
) OR s.[definition] LIKE N'%DATEDIFF%'
OR s.[definition] LIKE N'%CONVERT%'
OR s.[definition] LIKE N'%CAST%'
OR s.[definition] LIKE N'%DATEPART%'
OR s.[definition] LIKE N'%DEGREES%')
UNION
--persisted computed columns
SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.computed_columns AS c1 ON sed.referencing_id = c1.object_id AND sed.referencing_minor_id = c1.column_id
INNER JOIN sys.columns AS c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id = c2.column_id
INNER JOIN sys.types AS t ON c2.system_type_id = t.system_type_id
WHERE referencing_class = 1 AND referenced_class = 1
AND (c2.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
) OR c1.[definition] LIKE N'%DATEDIFF%'
OR c1.[definition] LIKE N'%CONVERT%'
OR c1.[definition] LIKE N'%DATEPART%'
OR c1.[definition] LIKE N'%DEGREES%')
AND (
-- the column is persisted
c1.is_persisted = 1
-- OR the column is included in an index
OR EXISTS (SELECT 1 FROM sys.index_columns AS ic
WHERE ic.object_id = c1.object_id AND ic.column_id=c1.column_id)
)
UNION
--indexed views
SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable'
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.indexes AS i ON sed.referencing_id = i.object_id AND sed.referencing_minor_id = i.index_id
INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id
INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id
WHERE referencing_class = 7 AND referenced_class = 1 AND i.has_filter = 1
AND c.system_type_id IN (
59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
)) AS a
SELECT @sql += N'DBCC CHECKCONSTRAINTS (N''' + object_for_checkconstraints + N'''); ' + @CRLF
FROM
(
SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checkconstraints'
FROM sys.sql_expression_dependencies AS sed
INNER JOIN sys.check_constraints AS c ON sed.referencing_id = c.object_id AND sed.referencing_class = 1
INNER JOIN sys.columns AS col ON sed.referenced_id = col.object_id AND sed.referenced_minor_id = col.column_id
INNER JOIN sys.types AS t ON col.system_type_id = t.system_type_id
WHERE referencing_class = 1 AND referenced_class = 1 AND (col.system_type_id IN
( 59 --real
, 62 --float
, 58 --smalldatetime
, 61 --datetime
, 60 --money
, 122 --smallmoney
, 106 --decimal
, 108 --numeric
, 56 --int
, 48 --tinyint
, 52 -- smallint
, 41 --time
, 127 --bigint
) OR c.[definition] LIKE N'%DATEDIFF%'
OR c.[definition] LIKE N'%CONVERT%'
OR c.[definition] LIKE N'%DATEPART%'
OR c.[definition] LIKE N'%DEGREES%')
) a
SET @sql += N'DBCC TRACEOFF(139,-1);';
PRINT @sql;
--to run the script immediately, use the following command:
--EXECUTE sp_executesql @sql;
GO