今天在 SSMS 中,我放错了指针并单击了“执行”按钮而不是“数据库”下拉菜单(它们在屏幕上相邻)。幸运的是,没有造成任何损害,但让我感到害怕的是,我可能已经在当前查询窗口中执行了所有操作,因为没有突出显示任何内容。我想在任何新查询窗口的顶部放置一个简单的命令,这将停止 F5 类型的执行。这似乎有效:
UPDATE atable SET intfield = 'freakout prevention' WHERE tablekey = 123 UPDATE atable SET intfield = 55 WHERE tablekey = 123
其中 intfield 是定义为 int 的列。运行两条线导致
将 varchar 值 ‘freakout Prevention’ 转换为数据类型 int 时转换失败。
此外,intfield 的值未设置为 55。
这是一个相当可靠的方法吗(我在这里不需要 100.00% - 足以捕捉我不小心执行“裸” F5 的罕见时间)“前缀”查询窗口以防止在没有突出显示时疯狂执行的方法并给出了执行命令?
如果您没有批次(例如,GO),那么您可以将 RETURN 作为第一行。
如果您需要阻止所有批处理运行,您可以在脚本开头放置一个延迟。或者你可以添加一些消息....
我编辑了这个答案以添加一些额外的代码来检查未结交易。这与最初的问题无关,但我发现这对一些开发人员来说是一个更大的问题。
RAISERROR('You ran me by accident. I will be wait for an hour for you to kill me.', 10, 1) WITH NOWAIT WHILE (1=1) BEGIN WAITFOR DELAY '1:00:00' RAISERROR('I''m still waiting. Please kill me. Here goes another hour...', 10, 1) WITH NOWAIT END GO RAISERROR('OMG! Get the backups ready for a restore in production! Also, update the resume.', 16, 1) WITH NOWAIT GO BEGIN TRAN GO -- [Updated] Extra check - open transaction WHILE ( @@TRANCOUNT > 0 ) BEGIN RAISERROR('Execution is almost complete; however, a transaction is open. Please COMMIT or ROLLBACK after you kill me. Waiting 1 minute...', 10, 1) WITH NOWAIT WAITFOR DELAY '0:01:00' END RAISERROR('Execution is complete.', 10, 1) WITH NOWAIT