Rozwiązywanie problemów z zależności SQL

W tym temacie opisano typowe problemy zależności obiektów i ich rozwiązania.

Dynamiczne sys.dm_sql_referenced_entities funkcji zarządzania jest powrót zależności poziomie kolumny

sys.dm_sql_referenced_entities funkcja systemu zgłasza wszystkie kolumna -poziom zależność dla odwołania związanych ze schematem.Na przykład funkcja zgłasza wszystkie kolumna -poziom zależności dla indeksowany widok ponieważ indeksowany widok wymaga powiązanie schematu.Jednakże, gdy odwołanie obiekt jest nie związanych ze schematem, zależności kolumna są zgłaszane tylko wtedy, gdy wszystkie instrukcje, w których są odwołanie do kolumna mogą być powiązane.Instrukcje można pomyślnie powiązać tylko wtedy, gdy istnieją wszystkie obiekty na czas oświadczenia są analizowane.Jeśli dowolna instrukcja zdefiniowane w obiekt nie można powiązać kolumna zależności nie zostanie zgłoszony i referenced_minor_id kolumna zostanie zwrócona wartość 0.Błąd 2020 jest wywoływane, gdy nie można rozpoznać zależności kolumna.Ten błąd nie uniemożliwia kwerendy zwracanie zależności poziom obiektu.

Roztwór

Popraw błędy zidentyfikowane w wiadomości przed błąd 2020.Na przykład w poniższym przykładzie kodu widoku Production.ApprovedDocuments jest zdefiniowany w kolumnach Title, ChangeNumber, i Status w Production.Document tabela. sys.dm_sql_referenced_entities funkcja systemu jest badany pod kątem obiektów i kolumny, na którym ApprovedDocuments zależy od widoku.Ponieważ widok nie zostanie utworzone za pomocą klauzula SCHEMA_BINDING Z kolumny w widoku można modyfikować w tabela, do której następuje odwołanie.Przykład modyfikuje kolumna ChangeNumber w Production.Document tabela, zmieniając go do TrackingNumber.Widok wykazu jest kwerenda ponownie ApprovedDocuments widoku; Jednakże nie można powiązać do wszystkich kolumn zdefiniowanych w widoku.Zwracane są błędy 207 i 2020, identyfikowanie problemu.Aby rozwiązać ten problem, widok musi być zmieniony, aby odzwierciedlały nową nazwę kolumna.

USE AdventureWorks2008R2;
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

Kwerenda zwraca następujące komunikaty o błędach.

Msg 207, Level 16, State 1, Procedure ApprovedDocuments, Line 3

Invalid column name 'ChangeNumber'.

Msg 2020, Level 16, State 1, Line 1

The dependencies reported for entity "Production.ApprovedDocuments" do not include references to columns. This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity. Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.

Poniższy przykład poprawia nazwę kolumna w widoku.

USE AdventureWorks2008R2;
GO
ALTER VIEW Production.ApprovedDocuments
AS
    SELECT Title,TrackingNumber, Status
    FROM Production.Document
    WHERE Status = 2;
GO

Kolumna is_ambiguous niespójne wartości danych zdefiniowane przez użytkownika funkcje raportów

Może się, że wartość zgłoszona kolumna is_ambiguous jest niespójny dla funkcji zdefiniowanej przez użytkownika. is_ambiguous kolumna w widoku wykazu sys.sql_expression_dependencies i dynamiczne funkcja sys.dm_sql_referenced_entities wskazuje, że odwołanie do obiekt jest niejednoznaczne.Oznacza to, że obiekt może rozwiązać przy uruchomieniu czas funkcję zdefiniowaną przez użytkownika, typ zdefiniowany przez użytkownika (UDT) lub XQuery odwołanie do kolumna typu xml.W zależności od tego, jak odwołanie do funkcja zdefiniowanej przez użytkownika, typ encji może lub nie może być jasne, co może spowodować is_ambiguous kolumna zestaw 1 (PRAWDA) w jednym przypadek i 0 (FAŁSZ) w innym.Na przykład rozważmy następującą procedura składowana.

CREATE PROCEDURE dbo.p1 
AS
    SELECT Sales.GetOrder() FROM t1;
    SELECT Sales.GetOrder();

W pierwszej instrukcja SELECT jest niejasne czy Sales.GetOrder() jest funkcja zdefiniowana przez użytkownika w Sales schematu lub kolumna o nazwie Sales typu UDT metoda o nazwie GetOrder().W takim przypadek is_ambiguous kolumna zostanie zestaw 1 Encja — odwołanie Sales.GetOrder().W drugim instrukcja SELECT, odniesienie do Sales.GetOrder() jest wyczyszczone; oparty na składni, to można tylko odwołanie do funkcja zdefiniowanej przez użytkownika.W takim przypadek is_ambiguous kolumna jest zestaw 0.To zachowanie może być wyświetlane, że wartość zgłoszona w is_ambiguous kolumna jest niespójna.Opis sposobu wartość is_ambiguous ustalona kolumna można wyjaśnić zgłoszone wartości.

is_ambiguous kolumna jest zestaw do gdy 0 (FAŁSZ):

  • Jest oczywiste, że odwołanie jest funkcja zdefiniowana przez użytkownika.Oznacza to, że kwerenda wiąże funkcja zdefiniowaną przez użytkownika i metoda UDT kolumna lub kolumna typu xml o tej nazwie nie istnieje.

  • Jest oczywiste, że odwołanie jest kolumna metoda UDT.Oznacza to, że istnieje kolumna o tej metoda UDT i funkcja zdefiniowanej przez użytkownika lub kolumnę typu xml o nazwie jest nie.

is_ambiguous kolumna jest zestaw do 1 gdy (PRAWDA):

  • Funkcja zdefiniowana przez użytkownika, metoda UDT kolumna lub kolumna typu xml o nazwie odwołania nie istnieje.

  • Odwołanie nazwa istnieje wielu podmiotów.Na przykład funkcja zdefiniowanej przez użytkownika i metoda UDT kolumna mają taką samą nazwę.

Podmioty, które są niejednoznaczne charakter, jest możliwe, że referenced_database_name i referenced_schema_name kolumny są nieprawidłowe.Na przykład rozważmy następującą funkcja zdefiniowaną przez użytkownika:

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;

Kolumny referenced_database_name i referenced_schema_name jest nieprawidłowy dla funkcja z powodu hierarchyid UDT wywołania metoda.Nie jest jasne, że odniesienia do h.empid.GetDescendant i h1.empid.GetAncestor są przy użyciu nazwy trzech części obiekt odniesienia (database.schema.object) lub metoda UDT (tabela.kolumna.metoda).

Roztwór

Żaden użytkownik nie akcja jest wymagane.

Referenced_id kolumny nie jest zgłaszany do zależności między bazami danych

referenced_id kolumna nigdy nie został rozwiązany dla odwołania między bazami danych w sys.sql_expression_dependencies wykazu widoku.Nazwa bazy danych i nazwa schematu są rejestrowane tylko wtedy, gdy nazwa jest jawnie określony.Na przykład, gdy określony jako MyDB.MySchema.MyTable, nazwy bazy danych i schematu są rejestrowane; Jednakże gdy określony jako MyDB..MyTable, rejestrowana jest nazwa bazy danych.

referenced_id Zgłoszonych dla odwołania między bazami danych w sys.dm_sql_referenced_entities funkcja systemu tylko wtedy, gdy odwołanie obiekt może być pomyślnie związany.Powiązanie może się nie powieść kilka przyczyn, w tym z następujących przyczyn:

  • Baza danych jest w trybie offline.

  • Odwołanie obiekt nie istnieje w bazie danych.

Roztwór

Zweryfikuj, że baza danych jest w trybie online i że odwołanie obiekt istnieje w bazie danych.

Kolumna referenced_id ma wartość Null dla odwołania do podmiotów w ramach bazy

sys.dm_sql_referenced_entities funkcja systemu oraz sys.sql_expression_dependencies Widok system zgłasza identyfikator wszelkich związanych ze schematem odwołuje się do obiekt.Jednak referenced_id kolumny jest NULL dla-powiązania schematu odwołania w bazie danych podczas identyfikator odwołanie obiekt nie można określić.Taka sytuacja może wystąpić, gdy:

  • Odwołanie obiekt nie istnieje w bazie danych.

  • Rozpoznawanie nazw jest zależne od rozmówcy.W takim przypadek is_caller_dependent kolumna jest zestaw 1.

Roztwór

Sprawdź, czy odwołanie obiekt istnieje w bazie danych.Utworzyć obiektu, jeśli nie znaleziono lub, jeśli istnieje obiekt, upewnij się, że są spełnione następujące wymagania:

  • Odwołanie obiekt pisownia nazwy.

  • Podana nazwa spełnia wymagania sortowanie bazy danych.Jeśli baza danych używa przypadek-sortowanie wrażliwe, określona nazwa określona musi odpowiadać dokładnie przypadek nazwa obiektu.Na przykład identyfikator obiektu o nazwie SalesHistory nie można znaleźć w bazie danych z przypadek-wielkość liter sortowanie, jeśli jest określony jako saleshistory.

  • Określono nazwę schematu obiektu.Nazwy dwóch części (schema_name.object_name) jest wymagany, jeżeli obiekt nie jest domyślny schemat wywołującego, sys schematu, lub dbo schematu.

Modyfikowanie definicji odwołujących się obiekt do spełnienia powyższych wymagań.

Jeśli Encja — odwołanie jest zależne od rozmówcy, należy zmodyfikować definicję odwołujący się obiekt, określając nazwę dwóch części Encja — odwołanie.Aby uzyskać więcej informacji o odwołaniach zależne od rozmówcy, zobacz Raportowanie zależności SQL.

Nie zgłoszono informacji o zależnościach obiektów w bazie danych głównych

SQL zależności obiektów użytkownika utworzone w master bazy danych są tworzone i utrzymywane.Jeśli nie są przekazywane zależności SQL dla obiekt, wykonaj następujące kroki:

  • Zapewnienia, że obiekt jest prawidłowy typ dla śledzenia zależności

    Informacje o zależnościach nie są śledzone dla wszystkich obiektów użytkowników.Lista obiekt Zobacz typy, dla których zależności informacji tworzone i utrzymywane, Opis zależności SQL.

  • Upewnij się, obiekt nie jest oznaczony jako obiekt systemu.

    Kwerenda is_ms_shipped kolumna obiekt sys.objects wykazu widoku.Jeśli ta kolumna jest ustawiona na 1, podmiot jest albo obiekt systemowy dostarczanego wraz z SQL Server, lub jest to obiekt użytkownika modyfikacji odzwierciedlającego obiektu systemu przez ręczne zestaw tej kolumny 1.

Roztwór

Jeśli obiekt jest typu, który nie jest obsługiwany, informacji o zależnościach nie będzie dostępne.

Zależności obiektów systemu nie są śledzone.Jeśli obiekt jest zdefiniowany przez użytkownika is_ms_shipped column musi być ustawiany na 0, jeśli chcesz SQL Server do tworzenia i obsługiwania zależności obiektu.