sql >> Database >  >> RDS >> Database

Fouten met gekoppelde servers ondervangen

SQL Server biedt een TRY CATCH mechanisme om een ​​toepassing in staat te stellen te beseffen dat er iets mis is gegaan en de juiste code uit te voeren om het probleem op te lossen. Bijvoorbeeld:

BEGIN TRY
   <some code>
END TRY
BEGIN CATCH 
   PRINT 'This is the error: ' + error_message()
END CATCH

De code in de TRY blok wordt eerst uitgevoerd. Als er een fout optreedt, wordt de uitvoering doorgegeven aan de CATCH blok.

Wat zijn de implicaties voor foutafhandeling als u TRY CATCH wilt gebruiken? met een gekoppelde server? In deze situatie kan er een fout optreden in:

  1. De lokale SQL Server-instantie.
  2. De SQL Server-interface die wordt gebruikt om de verbinding met de externe server te vergemakkelijken.
  3. De interface die wordt gebruikt om de externe server toegankelijk te maken voor SQL Server.

In onze voorbeeldconfiguratie wordt een Salesforce.com-server als externe server gebruikt. Voor dit externe servertype, interface 2. is de Microsoft OLE DB-provider voor ODBC-stuurprogramma's en interface 3. is de Salesforce.com ODBC-driver van Easysoft.

De volgende fout treedt lokaal op in SQL Server. De gekoppelde server met de naam SALESFORCE is nog niet gemaakt en daarom kan SQL Server het niet vinden:

BEGIN TRY
    EXEC('SELECT * FROM OPENQUERY(SALESFORCE, ''SELECT * FROM LEASE'')')
END TRY
BEGIN CATCH 
    PRINT 'This is the error: ' + error_message()
END CATCH
This is the error: Could not find server 'SALESFORCE' in sys.servers. Verify that
the correct server name was specified. If necessary, execute the stored procedure
sp_addlinkedserver to add the server to sys.servers.

De volgende fout treedt op in de laag Microsoft OLE DB Provider for ODBC Drivers. De gekoppelde server met de naam SALESFORCE verwijst naar een ODBC-gegevensbron die de verbindingsdetails voor de doelserver van Salesforce.com bevat. SQL Server is echter 64-bits, maar de ODBC-gegevensbron is ingesteld in de 32-bits ODBC-beheerder. De verbinding mislukt met een "architectuur komt niet overeen"-fout

OLE DB provider "MSDASQL" for linked server "SALESFORCE" returned message
"[Microsoft][ODBC Driver Manager] The specified DSN contains an architecture
mismatch between the Driver and Application".
This is the error: Cannot initialize the data source object of OLE DB provider
"MSDASQL" for linked server "SALESFORCE".

Merk op dat de interpretatie van de OLE DB-fout door SQL Server is opgevangen door de CATCH blok. De "ruwe" fout van de OLEDB-laag heeft dat niet.

Deze laatste fout treedt op in de ODBC-laag die wordt gebruikt om verbinding te maken met Salesforce.com. De selectiequery verwijst naar een aangepast Salesforce.com-object ("LEASE") dat nog niet is ingeschakeld en ingevuld. "[Easysoft ODBC]Base table or view LEASE not found" is een fout van het ODBC-stuurprogramma, dat wordt doorgegeven aan en weergegeven door de Microsoft OLE DB-provider voor ODBC-stuurprogramma's. Net als in het vorige voorbeeld is dit bericht niet trappable, de interpretatie van het bericht door SQL Server is wel trappable.

OLE DB provider "MSDASQL" for linked server "SALESFORCE" returned message
"[Easysoft ODBC]Base table or view LEASE not found".
This is the error: An error occurred while preparing the query
"SELECT * FROM LEASE" for execution against OLE DB provider "MSDASQL" for linked
server "SALESFORCE".

Voor meer informatie over SQL Server-foutafhandeling, zowel met als zonder gekoppelde servers, zie:

http://www.sommarskog.se/error_handling/Part1.html


  1. Hoe een standaardbeperking in MySQL toe te voegen?

  2. Op cursor gebaseerde records in PostgreSQL

  3. Krijg laatste insert-ID na een voorbereide insert met PDO

  4. Hoe dubbele waarden in een SQL-tabel te vinden