Ich arbeite derzeit an einer gespeicherten Prozedur, die Metadaten für eine Anwendung ändert. Diese gespeicherte Prozedur kann nur ausgeführt werden, wenn die Anwendung offline ist. Ich wollte nicht, dass Entwickler es versehentlich aufrufen und etwas kaputt machen, also dachte ich, ich wäre schlau und fügte diesen Block oben in die gespeicherte Prozedur ein:
IF (APP_NAME() NOT LIKE '%SQL Server Management Studio%')
BEGIN
RAISERROR(N'The stored procedure must be run interactively.', 10, -1, -1);
RETURN;
END;
Dies funktioniert bei normalen Ausführungen. Wenn Sie jedoch eine lokale Servergruppe ausführen, ändert sich der Anwendungsname in ".Net SqlClient Data Provider".
Ich kann keinen anderen Weg finden, um festzustellen, ob eine Abfrage von SSMS stammt. Ich kann nicht anhand von Benutzernamen unterscheiden, da unsere Anwendungen Domänenkonten verwenden. Der Hostname ist ebenfalls keine Option, da es Katastrophenszenarien gibt, in denen der Zugriff auf SSMS vom Datenbankserver selbst die erwartete Vorgehensweise ist (und ich während der Notfallwiederherstellung lieber niemanden überraschen möchte, auch wenn dies unwahrscheinlich ist). .
Gibt es bessere Möglichkeiten, um festzustellen, ob eine Abfrage von SSMS direkt an einen Server oder von einer Verbindungsservergruppe stammt?
select program_name from sys.sysprocesses where spid = @@SPID
?