Sorun giderme SQL bağımlılıklar
Bu konu, ortak nesne bağımlılık sorunlar ve çözümleri açıklar.
Dinamik yönetimi işlev sys.dm_sql_referenced_entities Does Not iade sütun düzey bağımlılıklar
Sys.dm_sql_referenced_entities sistem işlev, şemaya bağlı başvurular için herhangi bir sütun düzey bağımlılık bildirir.Örneğin, dizinli görünüm, şema cilt payı gerektirdiğinden işlev için dizinli görünüm, tüm sütun düzey bağımlılıkları bildirir.Başvurulan varlık şemaya bağlı olmadığında, yalnızca sütun başvurulan tüm ifadeleri bağlanabilir, ancak sütun bağımlılıklar raporlanır.Tüm nesne ifadeleri ayrıştırıldı anda varsa deyimleri başarılı bir şekilde bağlanabilir.Varlık, tanımlanan herhangi bir deyim bağlamak başarısız olursa, sütun bağımlılıklar değil bildirilir ve referenced_minor_id sütun 0 döndürür.Sütun bağımlılıkları çözülemeyen, hata 2020 oluşturulur.Bu hata, sorgu nesnesini döndüren gelen engellemez düzey bağımlılıklar.
Çözüm
Önce 2020 hata iletisinde tanımlanan hataları düzeltin.Örneğin, aşağıdaki kod örneği, Görünüm Production.ApprovedDocuments sütunları tanımlı Title, ChangeNumber, ve Status içinde Production.Document TABLO. Sys.dm_sql_referenced_entities sistem işlev, sütunlar ve nesneleri için sorgulanan ApprovedDocuments Görünüm bağlıdır. Görünümde başvurulan sütunları görünüme SCHEMA_BINDING, WITH yan tümcesini kullanarak oluşturulmadı çünkü değiştirilebilir, başvurulan tablo.Örneğin, sütun değiştirir ChangeNumber içinde Production.Document tablosunu için yeniden adlandırma TrackingNumber. Katalog görünümü yeniden için sorgulanan ApprovedDocuments Görünüm; ancak görünümde tanımlanan tüm sütunlara bağlanamıyor. 207 Ve 2020 hataları, sorunu tanımlayan döndürülür.Bu sorunu gidermek için , görünümü yeni sütun adını yansıtacak şekilde değiştirilmesi gerekir.
USE AdventureWorks;
GO
CREATE VIEW Production.ApprovedDocuments
AS
SELECT Title, ChangeNumber, Status
FROM Production.Document
WHERE Status = 2;
GO
SELECT referenced_schema_name AS schema_name
,referenced_entity_name AS table_name
,referenced_minor_name AS referenced_column
FROM sys.dm_sql_referenced_entities ('Production.ApprovedDocuments', 'OBJECT');
GO
EXEC sp_rename 'Production.Document.ChangeNumber', 'TrackingNumber', 'COLUMN';
GO
SELECT referenced_schema_name AS schema_name
,referenced_entity_name AS table_name
,referenced_minor_name AS referenced_column
FROM sys.dm_sql_referenced_entities ('Production.ApprovedDocuments', 'OBJECT');
GO
Sorgu, aşağıdaki hata iletilerini döndürür.
Msg 207, Düzey 16, State 1, Procedure ApprovedDocuments, satır 3
Geçersiz sütun adı 'ChangeNumber'.
Msg 2020, Düzey 16, State 1, 1 satır
"Production.ApprovedDocuments" varlık için bildirilen bağımlılıklar, sütun başvuruları dahil etmeyin.Bu varlığın varolmayan bir nesneyi başvurduğundan veya varlık bir veya daha fazla deyimlerinde bir hata nedeniyle olacaktır.Sorguyu yeniden çalıştırmadan önce varlık, hata olduğunu ve bu varlık tarafından başvurulan tüm nesneleri bulunduğundan emin olun.
Aşağıdaki örnek, sütun adı görünümündeki düzeltir.
USE AdventureWorks;
GO
ALTER VIEW Production.ApprovedDocuments
AS
SELECT Title,TrackingNumber, Status
FROM Production.Document
WHERE Status = 2;
GO
Sütun is_ambiguous User-Defined işlevler için tutarsız değerler bildiriyor
Kullanıcı tanımlı işlevler için sütun is_ambiguous bildirdi değeri tutarsız görüntülenebilir.The is_ambiguous sütun varlık için başvuru belirsiz sys.dm_sql_referenced_entities görünümü sys.sql_expression_dependencies katalog ve dinamik bir işlev gösterir.Kullanıcı tanımlı bir işlev, kullanıcı tanımlı tür (UDT) veya bir XQuery başvuru, çalışma zamanında varlık, çözümlemek için bir sütun türü xml. Kullanıcı tanımlı işlevin nasıl başvurulmaktadır bağlı varlık türü olabilir veya is_ambiguous sütunu olması neden olabilir açık olmayabilir küme 1 (doğru) bir durumda ve başka bir 0 (yanlış).Örneğin, saklı yordamını göz önünde bulundurun.
CREATE PROCEDURE dbo.p1
AS
SELECT Sales.GetOrder() FROM t1;
SELECT Sales.GetOrder();
Içinde ilk SELECT deyim, belirsiz olarak mı yoksa Sales.GetOrder() bir kullanıcı tanımlı işlev Sales şema veya adlı sütun Sales tür UDT adlı bir yöntem GetOrder(). Bu durum, is_ambiguous sütun başvurulan varlık için 1 olarak küme Sales.GetOrder(). Ikinci SELECT deyiminde, yapılan başvuru Sales.GetOrder() boşsa; sözdizimi, bağlı olarak, bu yalnızca kullanıcı tanımlı bir işlev başvurusu olabilir. Bu durum, is_ambiguous sütun 0 olarak küme.Bu davranış is_ambiguous bildirilen değer görünmesini yapabilir sütun tutarsız.Anlama nasıl is_ambiguous değerinin sütun belirlenir bildirilen değerlerin açıklığa kavuşturmak.
Is_ambiguous sütun 0 olarak ayarlanmışsa (yanlış) olduğunda:
Bu başvuru, kullanıcı tanımlı bir işlev olduğunu boştur.Diğer bir deyişle, kullanıcı tanımlı bir işlev ve sütun UDT yöntem veya sütun türü için sorgu bağlar xml Bu ada sahip mevcut değil.
Bu başvuru bir sütuna UDT yöntem olduğunu boştur.Diğer bir deyişle UDT yöntem ile bir sütunu varsa ve kullanıcı tanımlı işlev veya sütun türü xml adı ile başlamıyor.
Is_ambiguous sütun için 1 (doğru) olduğunda küme:
Kullanıcı tanımlı işlev, sütun UDT yöntem veya sütun türü xml Belirtilen ada sahip mevcut değil.
Başvurulan adı için birden çok birimin bulunmaktadır.Örneğin, kullanıcı tanımlı bir işlev ve UDT yöntem sütun aynı ada sahip.
Normalde belirsizdir varlıklar için referenced_database_name ve referenced_schema_name sütunları geçersizdir olanaklıdır.Örneğin, kullanıcı tanımlı fonksiyon aşağıdaki göz önünde bulundurun:
CREATE FUNCTION GetNextEmpHierarchyId (@empname varchar(25))
RETURNS hierarchyid
AS
BEGIN
RETURN
(
SELECT h.empid.GetDescendant((SELECT MAX(h1.empid)
FROM dbo.Employees AS h1
WHERE h1.empid.GetAncestor(1) = h.empid), NULL)
FROM dbo.Employees AS h
WHERE h.empname = @empname
)
END;
Sütunları referenced_database_name ve referenced_schema_name nedeniyle işlev için geçersiz olur hierarchyid UDT yöntem çağrıları. Için başvuruları açık değil h.empid.GetDescendant ve h1.empid.GetAncestor üç parçalı ad () bir kullanarak bir varlık başvuruları olanDatabase.Schema.Object) UDT yöntemine ( veyatablo.sütun.yöntem).
Çözüm
Herhangi bir kullanıcı işlemi yapmanız gerekmez.
Sütun referenced_id geçici veritabanı bağımlılıklar için bildirilen.
Referenced_id sütun başvuruları sys.sql_expression_dependencies Katalog görünümü geçici veritabanı için hiçbir zaman giderilmiştir.Yalnızca ad açıkça belirtildiği zaman, şema adı ve veritabanı adı kaydedilir.Veritabanı ve şema adlarını MyDB.MySchema.MyTable belirtildiğinde, örneğin kaydedilir, ancak MyDB belirtildiğindeTablom, veritabanı adı kaydedilir.
Yalnızca başvurulan varlık başarıyla bağlanabilir, referenced_id sys.dm_sql_referenced_entities sistem işlev geçici veritabanı başvuruları için raporlanır.Bağlama, aşağıdaki nedenler de dahil olmak üzere çeşitli nedenlerle başarısız olabilir:
Veritabanı büyük/küçük harf çevrimdışıdır.
Başvurulan varlık veritabanında yok.
Çözüm
Veritabanının çevrimiçi olduğundan emin olun ve başvurulan varlık veritabanında bulunmuyor.
Sütun referenced_id varlıkları veritabanı içinde başvuru için null olur.
Sistem işlev sys.dm_sql_referenced_entities ve sys.sql_expression_dependencies sistem görünümü herhangi bir şemaya bağlı başvurulan varlık KIMLIĞI bildirir.Başvurulan varlık KIMLIĞI belirlenemedi, ancak referenced_id sütun NULL olmayan-şemaya bağlı başvuru veritabanındaki içindir.Bu durum ortaya çıkabilir:
Başvurulan varlık veritabanında yok.
Arayanın bağımlı ad çözümlemesidir.Bu durumda, is_caller_dependent sütun 1 olarak küme.
Çözüm
Başvurulan varlığın veritabanında varolduğundan emin olun.Değil bulunamadı veya varlık varsa, aşağıdaki gereksinimlerin karşılandığını doğrulayın ise varlığı oluşturun:
Belirtilen varlık adı doğru yazdığınızdan.
Belirtilen ad, veritabanı harmanlama gereksinimlerini karşılar.Veritabanı büyük/küçük harfe duyarlı bir harmanlama kullanıyorsa, belirtilen belirtilen ad nesne adının tam durum eşleşmesi gerekir.Örneğin, adlı bir nesne KIMLIĞI SalesHistory olarak belirtilirse, büyük/küçük harfe duyarlı bir harmanlama veritabanında bulunmayacaktır. saleshistory.
Nesnenin şema adı belirtildi.Bir iki bölümlü bir ad)schema_name.object_name) nesne arayanın varsayılan şema, şema sys veya dbo şema değilse gereklidir.
Yukarıdaki gereksinimleri karşılamak için bir başvuru varlık tanımını değiştirin.
Başvurulan varlık arayanın bağımlı ise, başvurulan varlık iki bölümlü bir ad belirterek başvuru varlık tanımını değiştirin.Arayanın bağımlı başvurular hakkında daha fazla bilgi için bkz: SQL bağımlılıklar bildirdiği için.
Bağımlılık bilgileri, nesneler için bildirilen Not asıl veritabanı
Kullanıcı tanımlı varlıkları ana veritabanında oluşturulan SQL bağımlılıkları oluşturulan ve sürdürülür.Bir varlıkla ilgili SQL bağımlılıklar bildirdi, şu adımları izleyin:
Varlık izleme bağımlılığı için geçerli bir tür olduğundan emin olun
Tüm kullanıcı nesneleri için bağımlılık bilgileri izlenir.Hangi bağımlılığı için bilgi oluşturulan saklanır ve varlık türlerinin listesi için bkz: SQL Bağımlılıklar'ı anlama.
Varlık, bir sistem nesnesi olarak işaretlenmemiş emin olun.
Is_ms_shipped sütun için varlık, query sys.Objects kataloğunu görüntüleyin.Bu sütun, küme 1, varlık ile birlikte gelen ya da bir sistem nesnesidir SQL Server, veya bir sistem taklit edecek şekilde değiştirdi kullanıcı tanımlı bir nesnenin nesne el ile küme ting tarafından bu sütun için 1.
Çözüm
Nesne, desteklenmeyen bir tür ise, bağımlılık bilgileri kullanılamaz.
Sistem nesneleri bağımlılıkları izlenir.Varlık, kullanıcı tanımlı ise, isterseniz is_ms_shipped sütun 0 ile sıfırlanması gerekir SQL Server oluşturmak ve bağımlılıkları varlığı güncelleştirmek için.