自动表快照(无作业)SQL Server
Posted
技术标签:
【中文标题】自动表快照(无作业)SQL Server【英文标题】:Automatic Table Snapshot (No jobs) SQL Server 【发布时间】:2019-08-22 16:50:02 【问题描述】:我想在特定时间将表 inventory
中的信息保存到另一个表 inventoryHistory
。 (它每天都在变化)。
我只需要运行insert into select
查询,但我不知道如何自动运行它。
我真的不知道哪个是最好的选择,或者如果有另一个,我宁愿只在可能的情况下使用 SQL。
【问题讨论】:
您是否已经研究过 SQL Server 代理? docs.microsoft.com/en-us/sql/ssms/agent/… “我无权在数据库中编写作业。”我假设这意味着您不能使用 SQL Server 代理作业,因为权限问题,或者控制数据库或服务器的任何人都不允许安装它。在这种情况下,我能看到的唯一方法是永久 SQL 进程 - 使用无休止的WHILE
循环和WAITFOR
命令来避免消耗大量资源。请参阅下面的示例。
是的,我想你可以使用这种查询,但我总是遇到问题,因为一旦 SPID 因任何原因被杀死,它就会静默失败并且不会自行重启。我更愿意建议跳过头痛并请求允许运行夜间工作。
他们很头疼。但是,根据控制相关系统的人对编码器的限制,它们有时是必要的。
不,我不能使用代理工作。我想我将使用永久循环。谢谢。
【参考方案1】:
您可以使用 SQL Server Agent / Job / Job Scheduler 来自动化它: https://docs.microsoft.com/en-us/sql/ssms/agent/schedule-a-job?view=sql-server-2017
【讨论】:
【参考方案2】:首先,将归档命令创建为存储过程。
CREATE PROCEDURE ArchiveMyTable
AS
INSERT INTO MyTableArchive
SELECT *
FROM MyTable m
[Conditions and WHERE clauses here]
然后,您需要在服务器上每次启动时执行一次此命令
DECLARE @NextTime char(8)
WHILE 1 <> 0
BEGIN
-- Calculate next run here
-- This example just runs every hour at 15 minutes after the hour
SET @NextTime = CONVERT(varchar(3), DateAdd(Hour, 1, Dateadd(minute, -15, Getdate())), 108) + '15:00' -- Returns 'hh:15:00'
WAITFOR TIME @NextTime
EXEC ArchiveMyTable
END
这将在指定的时间执行存储过程。
【讨论】:
您还可以检查进程是否仍在运行,如果不是,则执行命令。这会增加复杂性,但根据您的情况可能是必要的。以上是关于自动表快照(无作业)SQL Server的主要内容,如果未能解决你的问题,请参考以下文章