Udostępnij za pośrednictwem


Zadanie agenta SQL, które wykonuje zapytanie rozproszone, może zakończyć się niepowodzeniem z komunikatami o błędach 65535, 782 lub 7437

Ten artykuł pomaga rozwiązać problem polegający na tym, że zadanie agenta SQL, które wykonuje zapytanie rozproszone, może zakończyć się niepowodzeniem z komunikatami o błędach 65535, 782 lub 7437.

Oryginalna wersja produktu: SQL Server
Oryginalny numer KB: 2492477

Symptomy

Zadanie agenta SQL wykonujące zapytanie rozproszone (połączonego serwera) może zakończyć się niepowodzeniem z jednym z komunikatów o błędach podobnych do następujących, gdy właściciel zadania nie jest członkiem roli serwera sysadmin :

  • Dostawca OLE DB "<nazwa> dostawcy" dla połączonego serwera "<Nazwa serwera> połączonego" zwrócił komunikat "Upłynął limit czasu logowania".
    Dostawca OLE DB "<nazwa> dostawcy" dla serwera połączonego ""<Nazwa serwera> połączonego" zwrócił komunikat "Wystąpił błąd podczas nawiązywania połączenia z serwerem. Podczas nawiązywania połączenia z programem SQL Server 2005 ten błąd może być spowodowany tym, że w ustawieniach domyślnych program SQL Server nie zezwala na połączenia zdalne".
    Msg 65535, poziom 16, stan 1, wiersz 0
    Interfejsy sieciowe SQL: Błąd podczas lokalizowania serwera/wystąpienia określonego [xFFFFFFFF].

  • Msg 782, poziom 16, stan 1, wiersz 0
    Dostawca SSL: w pakiecie zabezpieczeń nie są dostępne żadne poświadczenia
    Dostawca OLE DB "<nazwa> dostawcy" dla serwera połączonego "Nazwa serwera> połączonego" zwrócił komunikat "<Klient nie może nawiązać połączenia".

Na przykład w środowisku programu SQL Server 2008 komunikaty o błędach mogą być podobne do następujących:

  • Dostawca OLE DB "SQLNCLI" dla serwera połączonego "<Nazwa serwera> połączonego" zwrócił komunikat "Upłynął limit czasu logowania".
    Dostawca OLE DB "SQLNCLI" dla serwera połączonego ""<Nazwa serwera> połączonego" zwrócił komunikat "Wystąpił błąd podczas nawiązywania połączenia z serwerem. Podczas nawiązywania połączenia z programem SQL Server 2005 ten błąd może być spowodowany tym, że w ustawieniach domyślnych program SQL Server nie zezwala na połączenia zdalne".
    Msg 65535, poziom 16, stan 1, wiersz 0
    Interfejsy sieciowe SQL: Błąd podczas lokalizowania serwera/wystąpienia określonego [xFFFFFFFF].

  • Msg 782, poziom 16, stan 1, wiersz 0
    Dostawca PROTOKOŁU SSL: w dostawcy OLE DB pakietu zabezpieczeń "SQLNCLI10" dla serwera połączonego "Nazwa serwera> połączonego" zwrócony komunikat "<Klient nie może nawiązać połączenia".

  • Msg 7437, poziom 16, stan 1, wiersz 3
    Serwerów połączonych nie można używać w ramach personifikacji bez mapowania dla personifikowanego logowania.

To samo zachowanie może być również widoczne podczas korzystania z Openquery zapytania rozproszonego lub podczas wykonywania zapytania rozproszonego przy użyciu personifikacji za pomocą Execute as Login instrukcji języka T-SQL.

Przyczyna

Krok zadania Transact-SQL jest uruchamiany jako właściciel kroku zadania, jeśli właściciel kroku zadania nie jest członkiem stałej roli serwera sysadmin . Agent SQL używa Execute as Login polecenia do wykonania kroku zadania w kontekście właściciela kroku zadania. Nie można użyć instrukcji EXECUTE AS w granicach serwera. Wynika to z ustawienia fabrycznego. Aby uzyskać więcej informacji, zobacz następujące tematy w artykułach SQL Server Books Online:

Uwaga 16.

Ta sama przyczyna dotyczy scenariusza, w którym ręcznie spróbujesz zmienić kontekst wykonywania rozproszonego zapytania w studio zarządzania przy użyciu instrukcji EXECUTE AS .

Rozwiązanie

Ważne

Poniższe obejście wymaga zdefiniowania jawnego logowania serwera lokalnego do mapowań logowania serwera zdalnego przy użyciu strony Zabezpieczenia w obszarze Właściwości obiektu serwera połączonego. Ponieważ kolumna Użytkownik zdalny musi być identyfikatorem logowania uwierzytelniania programu SQL Server na serwerze zdalnym, tryb uwierzytelniania serwera zdalnego powinien być już ustawiony na tryb mieszany lub powinien zostać zmieniony na tryb mieszany przed użyciem obejścia.

Jeśli krok zadania T-SQL jest własnością użytkownika, który nie jest częścią roli serwera sysadmin i jeśli krok zawiera zapytanie rozproszone, wykonaj następujące kroki, aby upewnić się, że zadania lub zapytania nie kończą się niepowodzeniem:

  1. Utwórz mapowanie dla każdego właściciela kroku zadania na serwerze lokalnym do istniejącego lub nowego logowania na serwerze zdalnym.
  2. Upewnij się, że logowanie ma wystarczające uprawnienia do wykonywania różnych modułów na serwerze zdalnym, do których uzyskuje się dostęp w zapytaniu rozproszonym. Aby uzyskać więcej informacji, zobacz Właściwości serwera połączonego (strona zabezpieczeń).

Więcej informacji

Czasami można zauważyć, że zapytania omówione w jednej ze scenariuszy w sekcji Objawy mogą działać pomyślnie. Dzieje się tak zwykle, gdy personifikowany użytkownik wcześniej zalogował się do systemu zdalnego, a system nadal otwierał połączenie ustanowione przez użytkownika zdalnego. Nie należy oczekiwać, że zapytanie będzie działać przez cały czas.

Kroki odtwarzania zachowania

  1. W wystąpieniu SQL utwórz serwer połączony z innym wystąpieniem SQL przy użyciu programu SQL Server Management Studio (SSMS) lub następującego skryptu.

    EXEC master.dbo.sp_addlinkedserver @server = <server name>, @srvproduct=N'SQL Server'
    /* For security reasons the linked server remote logins password is changed with ######## */
    EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=<servername> ,
    @useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
    
  2. Wykonaj następujące zapytanie w programie SSMS przy użyciu identyfikatora logowania będącego członkiem roli serwera sysadmin i upewnij się, że działa prawidłowo.

    SELECT * FROM <servername>.master.sys.sysobjects
    
  3. Teraz zmień kontekst zapytania na konto inne niż sysadmin i wykonaj to samo zapytanie.

    EXECUTE AS login='Domain\Login1'
    GO
    SELECT suser_sname()
    GO
    SELECT * FROM <servername>.master.sys.sysobjects
    GO
    

Ten krok kończy się niepowodzeniem z powodu błędu wymienionego w sekcji Objawy .

Uwaga 16.

OPENROWSET i OPENDATASOURCE funkcje nie mają wpływu na ten problem, ponieważ te funkcje obejmują poświadczenia jako parametry.
BEGIN DISTRIBUTED TRANSACTION jest oddzielną instrukcją, która nie uzyskuje własnych poświadczeń i nie ma wpływu na ten problem. Jeśli jednak zabezpieczenia serwera połączonego nie są prawidłowo skonfigurowane, te instrukcje nadal mogą zakończyć się niepowodzeniem.