有没有'你确定要继续吗?' SQL命令?

时间:2012-03-08 16:12:21

标签: sql sql-server-2008

我们有很多SQL Server脚本。但是有一些关键脚本只能在某些条件下在特定时间运行。是否有办法通过某种弹出警告来保护我们自己?

即。运行这些关键脚本时,是否有命令询问用户是否要继续?

(我们已经制作了一些回滚脚本来处理这些问题,但如果它们根本不会被意外运行则会更好。)

6 个答案:

答案 0 :(得分:4)

不,没有这样的事情。

您可以编写一个应用程序(Windows服务?),它只会在应该运行时运行脚本。

你甚至问这个问题的事实表明,这应该是自动化的,越快越好。

您可以通过使用if来测试这些条件并仅在满足这些条件时执行,从而缓解此问题。如果这是一系列脚本,则应将它们包装在事务中以进行引导。

答案 1 :(得分:1)

您可以使用以下一种解决方法,它需要您更新另一个表中的值:

CREATE PROC dbo.MyProc
AS

WHILE (SELECT GoBit FROM dbo.OKToRun) = 0
BEGIN
    RAISERROR('Waiting for GoBit to be set!', 0,1)
    WAITFOR DELAY '00:00:10'
END

UPDATE dbo.OKtoRun
SET GoBit = 0

... DO STUFF ...

这将要求您在另一个spid或会话中手动更新该表,然后才能继续。

使用多个程序会变得更加复杂,因此它只能作为一个非常短期的解决方法。

答案 2 :(得分:0)

sql是一种查询语言。没有能力接受用户输入。

我能想到的唯一一件事就是@variable驱动它。第一部分应该更新@shouldRunSecond = 1.而第二部分应该包含在

if @shouldRunSecond = 1
begin
   ...
end
如果不需要,

将跳过第二部分。

答案 3 :(得分:0)

问题是 - 这些脚本位于何处? 如果你将它们作为每次运行之前打开的.sql文件,那么你可以在开始脚本之前添加一些“魔术数字”,在运行之前你必须每次都计算。在每次运行脚本之前的下面的示例中,您必须将正确的日期和分钟放入IF fondition中,否则其他明智的脚本将无法运行

IF DATEPART(dd,GETDATE())!=5 or DATEPART(mi,(GETDATE()))!=43
BEGIN
    RAISERROR ('You have tried occasionally to run your dangerous script !!!',16,1);
    RETURN
END

--Some dangerous actions
drop database MostImportantCustomer
update Personal set Bonus=0 where UserName=SUSER_SNAME()

如果您的脚本驻留在存储过程中 - 您可以添加某种“我确定,我知道我做什么”参数,您将始终通过该参数,例如Minute乘以Day。 Hote it help

答案 4 :(得分:0)

我见过包含SQLCMD ...的批处理脚本,因此您可以在脚本中添加提示,而不是从代码或管理工作室运行.sql脚本。

答案 5 :(得分:0)

我(在有限的情况下)创建了一个@AreYouSure参数,该参数必须传递给存储过程,然后在存储过程中的声明旁边添加注释,以说明运行该过程的危险。

至少那样,没有RANDO在不了解后果的情况下不会进入您的环境并启动存储过程。该参数可以放入IF语句中以检查其值,或者根本不需要使用该参数,但是如果必须传递该参数,则他们至少必须弄清楚该传递什么。

但是,如果使用过多,则其他人可能只是开始在每个存储过程中传递“ Y”或1,而无需阅读注释。您可以切换数据类型,但是在某些时候,维护此方案的工作量超出其价值。这就是为什么我会在有限的情况下使用它。