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?
quelle
select program_name from sys.sysprocesses where spid = @@SPID
?Antworten:
Warum widerrufen Sie nicht einfach die Berechtigungen der Benutzer, die die Prozedur nicht ausführen sollen, anstatt sich auf verwackelte Annahmen bezüglich des Anwendungsnamens zu verlassen?
Sie sagten, Entwickler sollten es nicht versehentlich ausführen: Widerrufen Sie ihnen die EXECUTE-Berechtigungen und zwingen Sie sie, eine andere Anmeldung zu verwenden, um diese Aufgabe auszuführen (wenn sie sie ausführen sollen, behalten Sie dieses Privileg ansonsten für Sie oder den Anwendungsadministrator).
quelle