在运行SQL之前检查数据库名称

icc*_*c97 4 sql sql-server

在SQL Server Management Studio中,我反复管理对主数据库而不是我想要的特定数据库运行sql脚本.我打开一个SQL文件,然后单击运行,反复忘记先设置数据库.

我知道你可以为服务器连接设置一个默认值 - 但是如果我的意图不是默认数据库,那么我最终可能会在默认数据库而不是我想要的数据库上运行sql.

sql中的USE语句也不起作用 - 脚本需要针对多个不同的测试数据库运行.

那么无论如何都要标记一个警告,即脚本即将针对master数据库运行?或者可能在脚本运行之前强制选择数据库?

gbn*_*gbn 11

一种方法是使用仅在所需数据库中具有权限的帐户进行连接.不是系统管理员,而是你现在正在做的事情.

这对开发人员来说是正常的

如果要以sysadmin身份运行,请将此行添加到每个脚本中

IF DB_NAME() = 'master'
    RAISERROR ('Oi! Stop!', 20, 1)  WITH LOG
GO
Run Code Online (Sandbox Code Playgroud)

这将终止连接

编辑:

我喜欢Quassnoi的解决方案,因为它不需要系统管理员权限.但是,您无法提供反馈或还原.

所以,我一直在玩这个.它检查大多数盒子

  • 有趣的消息
  • 不需要系统管理员
  • 重新运行(有点)

有一个问题是SSMS USE(通过下拉列表)被忽略(根据Quassnoi的说明),但它已经到了那里.有没有更多的想法?

SET NOEXEC OFF;
GO
DECLARE @isOK bit;
BEGIN TRY
    IF DB_NAME() IN ('master', 'protectedDB1', '...')
       RAISERROR ('To Catch Block Only', 16, 1);
    SET @isOK = 1;
END TRY
BEGIN CATCH
    SET @isOK = 0;
    RAISERROR ('Oi! Stop!', 16, 1);
END CATCH
IF @isOK = 0
    SET NOEXEC ON;
GO
SELECT 1;
GO
Run Code Online (Sandbox Code Playgroud)


Qua*_*noi 7

IF DB_NAME() = 'master'
        SET NOEXEC ON
GO
SELECT  1
GO
Run Code Online (Sandbox Code Playgroud)

SET NOEXEC 将使脚本中的其余语句编译但不执行.

您必须先发出问题SET NOEXEC OFF才能在此连接中执行任何操作(甚至在下拉框中选择数据库).

或者,只需关闭并重新打开脚本文件,它将关闭并重新打开连接.