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

时间:2011-08-05 09:47:04

标签: sql sql-server

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

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

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

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

2 个答案:

答案 0 :(得分:11)

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

这对开发者来说是正常的

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

IF DB_NAME() = 'master'
    RAISERROR ('Oi! Stop!', 20, 1)  WITH LOG
GO

这将终止连接

编辑:

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

所以,我一直在玩这个。它检查大多数框

  • 有趣的消息
  • 不需要系统管理员
  • re-runnable(种类)

有一个问题是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

答案 1 :(得分:7)

IF DB_NAME() = 'master'
        SET NOEXEC ON
GO
SELECT  1
GO

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

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

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