2012-03-08 64 views
0

我们有很多SQL Server脚本。但是有一些关键脚本只能在特定条件下的特定时间运行。有没有办法通过某种弹出警告来保护我们自己?有没有'你确定要继续吗?' SQL命令?

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

(我们已经制作了一些回滚脚本来处理这些脚本,但最好不要意外运行)。

回答

4

不,没有这样的事情。

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

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

您可以通过使用if来测试这些条件,并且只有在符合条件时才执行,从而缓解问题。如果这是一系列脚本,则应将其包装在事务中以引导。

+2

+1 - SQL脚本**不交互**。 – JNK 2012-03-08 16:19:04

0

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

唯一我能想到的就是让它变@驱动。第一部分应更新@shouldRunSecond = 1,第二部分应包装在

if @shouldRunSecond = 1 
begin 
    ... 
end 

如果不需要,第二部分将被跳过。

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或会话,手动更新表在它继续之前。

这对于多个过程来说会变得复杂得多,所以它只能作为一个非常短期的解决方法。

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() 

如果你的脚本放在存储过程 - 你可以添加某种“我确定,我知道我做了什么“参数,你总是会通过,例如分钟乘以日。 Hote it helps

0

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