自动表快照(无作业)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的主要内容,如果未能解决你的问题,请参考以下文章

使用SQL Server 2005作业设置定时任务

Sql Server代理作业

初识SQL Server代理&作业

如何处理SQL Server事务复制中的大事务操作

SQL SERVER 作业浅析

Sql Server 如何按每个月自动生成一张表,求大师指点一下下