2016-09-08 8 views
1

Ziel: Schreiben Sie eine T-SQL-Anweisung, die auf Anmeldeberechtigungen für eine Verbindungsserver-Datenbank überprüft und dann einen Spaltenwert basierend auf dem Login-Ergebnis aktualisiert.T-SQL: Wenn die Anmeldung fehlgeschlagen ist, dann sql

Sudo-ish Code:

@Source = linked server connection string 

while true 

if exists(select [Something] from [@Source]) 
update [Table] set [Column] = 1 
else 
update [Table] set [Column] = 0 

@Source = next linked server 

Die Idee ist, dass, wenn ich nicht einen Datensatz aus der Tabelle bekommen, dann keinen Zugriff habe ich. Wenn ich diese Abfrage unter Verwendung von aktuellem T-SQL ausfühle, tritt der Login-Failed-Fehler auf. Gibt es irgendwelche Möglichkeiten, dies mit T-SQL zu erreichen? Zurzeit überprüfe und aktualisiere ich manuell.

+0

verwenden welche Sprache ist das? Verbindungszeichenfolge macht keinen Sinn in Tsql – Hogan

+0

Wenn Sie fragen, ob Sie in die richtige Richtung gehen, ist die Antwort nein - Sie sollten nicht verwenden, wenn Anweisungen in SQL. – Hogan

Antwort

0

Wenn Sie fragen, ob Sie in die richtige Richtung gehen, würde ich Nein sagen. Hier ist Sudo-ish-Code:

-- perform connection to external server. 

-- make update 
update <table> 
    SET <field to indicate result> = <result> 
WHERE <filter to select row> 

Hier ist ein weiterer Hinweis. <result> könnte so etwas wie

SET <field> = CASE WHEN @login = 'OK' THEN 1 ELSE 0 END 
0

sein, wenn Sie einen Verbindungsserver verwenden, erhalten Sie eine Fehlermeldung erhalten, wenn Sie select versuchen und Sie keine Berechtigung haben. Dies kann nicht mit einer einzigen Anweisung durchgeführt werden. Ich nehme an, Sie verwenden bereits eine gespeicherte Prozedur, wenn Sie IF s verwenden.

Sie können die Funktion sp_testlinkedserver verwenden, die dafür entwickelt wurde (eine Art, die immer noch auf Ausnahmenbehandlung basiert). Sie müssen immer noch eine TRY/CATCH wie

declare @TestedServerReturnValue int 
BEGIN TRY 
    EXEC @TestedServerReturnValue = sys.sp_testlinkedserver @ServerName 
END TRY 
BEGIN CATCH 
    SET @TestedServerReturnValue = @@error 
END CATCH 

IF @TestedServerReturnValue = 0 BEGIN 
    Print 'Success' 
END 
ELSE BEGIN 
    print 'Could not connect' 
END 
+0

Dies kommt näher zu dem, was ich frage .. So ist das Kuriose, dass ich Login-Funktionen für den Server haben, aber meine Berechtigungen enden auf der Db-Ebene. Die Verwendung von sp_testlinkedserver liefert also immer noch ein erfolgreiches Ergebnis. – LostInTheSauce

+0

Grundsätzlich habe ich mehrere Server, jeder mit einer Metadaten-DB. Die Metadaten-DB hat auf allen Servern das gleiche Schema. Mein Ziel ist es, die Metadaten der letzten drei Monate von jedem verbundenen Server abzurufen und die Metadaten in einer einzigen Tabelle auf meinem Server zu platzieren. Ich benutze eine SP, um dies zu erreichen. Beim Durchlaufen jedes Verbindungsservers schlägt die gesamte sp fehl, wenn ich auf einen Server stoße, für den ich die Tabelle nicht abfragen kann. Daher möchte ich eine Anweisung erstellen, die den Verbindungsserver grundsätzlich überspringt, wenn die Abfrage aufgrund von Berechtigungsproblemen fehlschlägt. – LostInTheSauce

+0

Wenn ich das getan habe, habe ich einen Cursor verwendet, um die Liste der Server zu durchlaufen, die Verbindung zu testen und dann die Select-Anweisungen zu testen. Jeder Fehlerpunkt befindet sich in einem TRY/CATCH, wenn eine Wiederherstellung möglich ist, sodass ich mit dem Rest der Server fortfahren kann. – Brad

Verwandte Themen