Verhindern Sie, dass eine gespeicherte Prozedur außerhalb von SSMS ausgeführt wird

7

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?

mgw854
quelle
Erhalten Sie das gleiche Problem, wenn Sie ausführen : select program_name from sys.sysprocesses where spid = @@SPID?
Ste Bov
@SteBov, ja, es wird immer noch als ".Net SqlClient Data Provider"
angezeigt
Ich bekomme immer SSMS dafür gemeldet. Unsere Web-Apps (die kein SSMS haben oder ausführen) werden als .net SQL gemeldet, aber ich kann das von Ihnen beschriebene Problem nicht replizieren
Ste Bov
1
@ mgw854 Ich versuche zu helfen. Vielleicht möchten Sie dies als eine gute Gelegenheit betrachten, um eine Anwendung zu reparieren, bei der Verbindungszeichenfolgen niemals im Code fest codiert sein sollten.
Aaron Bertrand
1
Ja, um zu wiederholen, was @AaronBertrand gesagt hat, sollten Sie diese Verbindungszeichenfolgen so schnell wie möglich in eine zentrale Konfigurationsdatei übernehmen. Wie können Sie derzeit Ihr Datenbankkennwort ändern? Ich bezweifle, dass Sie dies jemals tun, was bedeutet, dass jeder Mitarbeiter, der Ihren Code berührt hat, für immer auf alle Daten zugreifen kann. Wenn Ihr Passwort jemals durchgesickert ist, haben Sie eine schreckliche Situation verschlimmert, weil Sie nicht schnell reagieren können.
Erik

Antworten:

20

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).

spaghettidba
quelle