我们只有SQL Servre标准版,因此我无法使用快照功能。在花时间之前,只想知道以下是否可行(或者如果有更好的方法)请:
在每个月末,我需要拍摄一个月的快照并将其存储在表b中。下个月将拍摄另一个快照并将追加该快照数据附加到表b。等等......
是否可以创建一个存储过程,以便在每月月底运行将快照数据存储到临时表A.然后使用另一个存储过程,从临时表A中获取数据并追加到表B?第二个程序可以有一个删除表A.
干杯。
答案 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可能会选择使用更精细的锁(例如页锁或行锁)而不是锁定整个表