Udostępnij za pośrednictwem


Troubleshooting SQL Dependencies

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

Dynamiczne funkcja zarządzania sys.dm_sql_referenced_entities czy nie zwrotu kolumna poziom zależności

Funkcja systemowa sys.dm_sql_referenced_entities zgłosi dowolnej kolumna — poziom zależności dla odwołania związanych ze schematem.Na przykład funkcja zgłosi wszystkie zależności poziomie kolumna do widoku indeksowanego, ponieważ widok indeksowany wymaga wiązanie schematu.Niemniej jednak, jeśli odwołania obiekt jest nie związanych ze schematem, kolumna zależności są zgłaszane tylko wtedy, gdy wszystkie instrukcje, w którym odwołania do kolumn, które mogą być powiązane.Instrukcje można powiązać pomyślnie tylko wtedy, gdy istnieją wszystkie obiekty w czasie, są w sytuacji, w sprawozdaniu.Jeśli wszystkie instrukcja jest zdefiniowany w obiekt nie powiedzie się, aby związać kolumna zależności nie będą raportowane i kolumn referenced_minor_id zwraca 0.Błąd 2020 jest wywoływane, gdy nie można rozpoznać zależności kolumna.Ten błąd nie uniemożliwia kwerenda zwraca poziom obiekt zależności.

Rozwiązanie

Popraw wszystkie błędy, podany w komunikacie przed błąd 2020.Na przykład w poniższym przykładzie widok Production.ApprovedDocuments jest zdefiniowany w kolumnach Title, ChangeNumber, a Status w Production.Document Tabela. Funkcja systemowa sys.dm_sql_referenced_entities jest kwerendy dla obiektów i kolumn, na którym ApprovedDocuments zależy od widoku. Ponieważ widok nie jest tworzone przy użyciu klauzula WITH SCHEMA_BINDING, kolumn, do którego odwołuje się w widoku mogą być modyfikowane w tabela, do którego istnieje odwołanie.W przykładzie zmienia się kolumna ChangeNumber w Production.Document Tabela przez zmianę jego nazwy TrackingNumber. Wyświetlanie katalogu jest ponownie kwerendy dotyczącej ApprovedDocuments Widok, jednak nie można powiązać wszystkie kolumny zdefiniowane w widoku. Błędy 207 i 2020 są zwracane w identyfikacji problemu.Aby rozwiązać ten problem, w widoku musi być zmieniony, aby odzwierciedlały nową nazwę kolumna.

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

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

Msg 207 poziom 16, Państwa 1, procedura ApprovedDocuments, linia 3

Nazwa kolumna nieprawidłowy "ChangeNumber".

Msg 2020, poziom 16 Państwo 1, wiersz 1

Zależności zgłoszonych dla obiektu "Production.ApprovedDocuments" nie zawierają odwołania do kolumn.Jest tak, ponieważ obiekt odwołuje się do obiektu, który nie istnieje lub z powodu błędu w jedną lub więcej instrukcji w obiekcie.Przed ponowne kwerendy, upewnić się, że w obiekcie są bez błędów i że wszystkie obiekty, do którego odnosi się obiekt istnieje.

W poniższym przykładzie poprawia nazwę kolumna w widoku.

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

To może pojawić się, że wartość podana kolumna is_ambiguous jest niespójny dla funkcji zdefiniowanej przez użytkownika.kolumna is_ambiguous w katalogu sys.sql_expression_dependencies widoku i sys.dm_sql_referenced_entities funkcja dynamicznego wskazuje, że odwołanie do obiekt jest niejednoznaczna.Oznacza to obiekt można rozwiązać w czasie wykonywania funkcja zdefiniowanej przez użytkownika, typ zdefiniowany przez użytkownika (UDT) lub odwołaniem do kolumna typu XQuery xml. W zależności od tego, jak odwołanie do funkcja zdefiniowanej przez użytkownika obiekt typu może, ale nie musi być wyczyszczone, co może spowodować, że kolumna is_ambiguous należy ustawić na wartość 1 (PRAWDA), przypadek jednego i 0 (FAŁSZ) w innym.Na przykład rozważmy następującą procedura przechowywana.

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

W pierwszej instrukcja SELECT, jest niejasne czy Sales.GetOrder() jest to funkcja zdefiniowana przez użytkownika w Sales schemat lub kolumna o nazwie Sales typu UDT z metoda o nazwie GetOrder(). W takim przypadek będzie można ustawić kolumna is_ambiguous odwołania 1 obiekt Sales.GetOrder(). W instrukcja SELECT drugie odwołanie do Sales.GetOrder() powinno być wyczyszczone; w oparciu o składni, to może być tylko odwołanie do funkcja zdefiniowanej przez użytkownika. W takim przypadek jest kolumna is_ambiguous zestaw na 0.To zachowanie mogą sprawić, że pojawiają się, że wartość podana kolumna is_ambiguous jest niezgodny.Opis, jak określić wartości kolumna is_ambiguous mogą wyjaśnić zgłoszone wartości.

Kolumna is_ambiguous zestaw do 0 (false) po:

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

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

Kolumna is_ambiguous zestaw do 1 gdy (true):

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

  • Nazwa odwołania istnieje wiele jednostek.Na przykład funkcja zdefiniowanej przez użytkownika i metoda UDT kolumna mają taką samą nazwę.

Dla jednostek, które są niejednoznaczne charakter istnieje możliwość, że kolumny referenced_database_name i referenced_schema_name są nieprawidłowe.Na przykład należy wziąć pod uwagę następujące funkcja zdefiniowanej 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;

Referenced_database_name kolumn i referenced_schema_name będą nieprawidłowe dla tej funkcja z powodu hierarchyid Wywołania metoda UDT. Nie jest jasne, który odwołuje się do h.empid.GetDescendant i h1.empid.GetAncestor są odwołaniami obiekt za pomocą (Nazwa trzech częściDatabase.Schema.Object) lub do metoda UDT (tabela.kolumna.metoda).

Rozwiązanie

Nie jest wymagane.

Referenced_id kolumna nie jest raportowana dla bazy danych poza granice zależności

kolumna referenced_id nigdy nie zostanie rozwiązany dla bazy danych między odwołaniami w widoku sys.sql_expression_dependencies wykazu.Nazwa bazy danych i nazwa schematu są rejestrowane tylko wtedy, gdy nazwa jest jawnie określony.Na przykład, jeżeli określony jako MyDB.MySchema.MyTable, nazwy bazy danych i schematu są rejestrowane, jednak, gdy jest to określone jako MyDBRejestrowana jest Moja_tabela tylko nazwę bazy danych.

The referenced_id po zgłoszeniu dla bazy danych między odwołania w funkcja systemowej sys.dm_sql_referenced_entities tylko wtedy, gdy odwołania obiekt można powiązać pomyślnie.wiązanie mogą nie działać w kilku powodów, łącznie z następujących przyczyn:

  • Baza danych jest w trybie offline.

  • obiekt odwołania nie istnieje w bazie danych.

Rozwiązanie

Sprawdź, czy baza danych jest w trybie online i że odwołania obiekt istnieje w bazie danych.

Referenced_id kolumna jest wartość NULL dla wskazaną obiektów w ramach Database

Funkcja systemowa sys.dm_sql_referenced_entities i widoku systemu sys.sql_expression_dependencies zgłosi identyfikator żadnych związanych ze schematem odwołuje się do obiekt.Jednak kolumna referenced_id ma wartość NULL dla odwołania do innych niż związanych ze schematem bazy danych, gdy identyfikator odwołania obiekt nie może być określony.Taka sytuacja może wystąpić, gdy:

  • obiekt odwołania nie istnieje w bazie danych.

  • Rozpoznawanie nazw jest zależne od rozmówcy.W takim przypadek kolumnie is_caller_dependent jest równa 1.

Rozwiązanie

Sprawdź, czy odwołania obiekt istnieje w bazie danych.Utwórz obiekt, jeśli nie można odnaleźć lub, jeśli istnieje obiekt, upewnij się, że są spełnione następujące wymagania:

  • Nazwa obiektu, do której następuje odwołanie jest poprawna.

  • Podana nazwa spełnia wymagania sortowanie bazy danych.Jeśli baza danych używa sortowanie uwzględnia wielkość liter, określona nazwa określona muszą odpowiadać przypadek dokładną nazwę obiektu.Na przykład IDENTYFIKATOREM obiektu o nazwie SalesHistory nie będzie można znaleźć w bazie danych z uwzględnieniem wielkości liter sortowanie, jeśli jest określony jako saleshistory.

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

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

Jeśli obiekt odwołania jest zależne od rozmówcy, należy zmodyfikować definicję obiekt odwołujący się przez określenie nazwy dwóch części dla encji, do którego istnieje odwołanie.Aby uzyskać więcej informacji o odwołaniach zależne od rozmówcy zobacz Raportowanie zależności SQL.

Informacje o zależnościach nie jest raportowana dla obiektów w wzorzec bazy danych

SQL zależności obiektów zdefiniowanych przez użytkownika utworzone w głównej bazie danych są tworzone i obsługiwane.Jeśli program SQL zależności dla obiekt są niezgłoszonych, wykonaj następujące kroki:

  • Upewnić się, że obiekt jest prawidłowym typem dla śledzenia zależności

    Informacje o zależnościach nie są śledzone dla wszystkich obiektów użytkowników.Aby listę typów obiekt, dla których zależności informacji do tworzenia i obsługi zobacz Understanding SQL Dependencies.

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

    Kwerendy kolumna is_ms_shipped obiektu sys.Objects Służy do wyświetlania katalogu. Jeśli ta kolumna jest zestaw na 1, jednostka jest albo systemu obiektu dostarczanego wraz z SQL Server, lub znajduje się obiekt zdefiniowany przez użytkownika, który została zmodyfikowana, aby imitować system obiektu przez ręczne ting zestaw tej kolumny 1.

Rozwiązanie

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

Zależności obiektów systemu nie są śledzone.Jeśli obiekt jest zdefiniowany przez użytkownika, należy przywrócić na 0 kolumna is_ms_shipped należy SQL Server Umożliwia tworzenie i zarządzanie nimi zależności obiektu.