我们只有SQL Server标准版,因此无法访问快照功能。选项?

时间:2017-01-25 05:23:42

标签: sql-server stored-procedures snapshot

我们只有SQL Servre标准版,因此我无法使用快照功能。在花时间之前,只想知道以下是否可行(或者如果有更好的方法)请:

在每个月末,我需要拍摄一个月的快照并将其存储在表b中。下个月将拍摄另一个快照并将追加该快照数据附加到表b。等等......

是否可以创建一个存储过程,以便在每月月底运行将快照数据存储到临时表A.然后使用另一个存储过程,从临时表A中获取数据并追加到表B?第二个程序可以有一个删除表A.

干杯。

1 个答案:

答案 0 :(得分:1)

是的,这是可能的。

如果我了解你,或多或少,这就是你想要的:

  • 锁定表格
  • 将所有内容选入临时表
  • 将该登台表中的所有内容移至目的地

您可以锁定整个表格(这样可以防止更改,但可能会导致死锁)。

INSERT INTO stagingTable (
  ... -- field list
)
SELECT
  ... -- field list
FROM
  myTable WITH (TABLOCK)
;

TABLOCK将在表上放置一个共享锁,该语句将在执行语句(READ COMMITTED隔离级别)时或在提交/回滚事务后释放(SERIALIZABLE

如果要在整个事务期间保持锁定,也可以添加HOLDLOCK提示,将隔离级别切换为对象的可序列化,因此锁定将在COMMIT之后释放。不要忘记启动事务并将其提交/回滚。

您还可以使用TABLOCKX,这是一个独占锁,可防止所有进程获取表上的锁或表中较低级别(页面,行等)上的任何内容。这也可以防止并发读取!

您可以让SQL Server决定它要使用哪个锁(也就是省略提示),在这种情况下,SQL Server可能会选择使用更精细的锁(例如页锁或行锁)而不是锁定整个表