防止在 SSMS 之外执行存储过程

mgw*_*854 8 sql-server ssms

我目前正在研究修改应用程序元数据的存储过程。此存储过程只能在应用程序脱机时运行。我不希望开发人员不小心调用它并破坏某些东西,所以我认为我很聪明,将这个块插入到存储过程的顶部:

IF (APP_NAME() NOT LIKE '%SQL Server Management Studio%')
BEGIN
  RAISERROR(N'The stored procedure must be run interactively.', 10, -1, -1);
  RETURN;
END;
Run Code Online (Sandbox Code Playgroud)

这适用于正常执行,但在本地服务器组上运行时,应用程序名称更改为“.Net SqlClient 数据提供程序”。

我找不到另一种方法来确定查询是否来自 SSMS。我无法根据用户名进行区分,因为我们的应用程序使用域帐户。主机名也不是一个选项,因为在某些灾难场景中,从数据库服务器本身访问 SSMS 是预期的操作过程(并且我宁愿在灾难恢复期间不会让任何人感到惊讶,即使它不太可能) .

是否有更好的方法来确定查询是来自 SSMS,是直接发送到一台服务器还是来自链接服务器组?

spa*_*dba 20

与其依赖于对应用程序名称的摇摆不定的假设,为什么不直接撤销那些不应该运行该过程的用户的权限呢?

您说过开发人员不应意外运行它:撤销他们的 EXECUTE 权限并强制他们使用不同的登录名来执行此任务(如果他们应该执行此任务,否则为您或应用程序管理员保留此权限)。