我有一个 SQL Server 代理作业,每分钟创建一次我的主数据库的快照:
-- delete snapshot if it exists
if exists (select * from sys.databases where name = 'mydb_snapshot' )
begin
drop database [mydb_snapshot]
end;
-- create new snapshot (whether or not we just deleted an old one)
create database [mydb_snapshot] on ( NAME = 'MYDBYEAH', FILENAME = 'D:\mydb_snapshot.ss' ) as snapshot of [mydb];
快照既用于报告,也用于稍后在同一作业步骤中的查询。
(我是 Sql Server Agent Jobs and Snapshots 的新手,所以请随意指出目前为止的任何 WTF。)
我的问题是 Sql Server Agent 根本拒绝运行该作业,理由是 [mydb_snapshot] 不存在:
数据库“mydb_snapshot”不存在。确保名称输入正确。[SQLSTATE 08004](错误 911)。该步骤失败。
(该错误没有与之关联的行号。相反,似乎 SS Agent在开始运行脚本之前正在检查整个脚本,并且足够聪明,可以看到我引用了一个不存在的快照,但不够聪明,无法看到我总是在前一行创建快照。通过调试语句,我可以看到它甚至没有在我的作业步骤中运行 TSQL 的第一行。
有什么想法可以让 SQL Server Agent 运行这项工作吗?
或者完全不同的方法?
(我试过的一件事:如果我首先手动运行上面的create database [mydb_snapshot]语句,它确实有效。从那时起,作业每分钟运行一次,没有问题。但这意味着如果该快照被删除 - 这发生在至少一次,不知道为什么——我的工作无缘无故地失败了)。
将“删除数据库 [myDb_snapshot]”替换为:
在运行之前评估整个 SQL 语句的正确性。由于快照不存在,因此不会运行。动态 SQL 消除了该限制。