如何检查SQL Server数据库引擎是否正在更新?

时间:2014-04-02 19:54:21

标签: sql sql-server database sql-server-agent

上下文:我有一个名为DB4的SQL Server数据库引擎,它每隔5小时通过SQL Server代理从另一个名为DB5的数据库引擎更新其所有数据库。我无法访问DB5,但我被告知DB5也在从其他地方更新。

问题:问题是有时两个数据库引擎会同时更新其数据库,因此DB4无法完全更新。

问题:我有什么方法可以检测DB5是否正在更新?然后我可以写SQL服务器代理作业,比如DB5没有更新然后更新DB4,否则什么都不做。

PS:许多代理作业处理DB4更新的方式。有人在工作中写了很多脚本。基本上,脚本就像这样的格式:

TRUNCATE Table_Name
INSERT INTO Table_Name
SELECT field_name1,field_name2 ......
FROM DB5.database_name.table_Name

1 个答案:

答案 0 :(得分:0)

通过DB4,DB5你的意思是服务器而不是数据库,这里的名字令人困惑。 但是,如果您可以访问DB4并且DB4正在从DB5中进行选择,则表示DB5是在DB4中注册的链接服务器,其用户对DB5数据库具有查询权限,而 MAY 具有insert / update /删除/创建对象权限。如果是,那么您可以在DB5.database_name中创建一个表,如下所示:

CREATE TABLE DB5.database_name.dbo.Table_Flag(Uflag bit NOT NULL)
GO
INSERT INTO DB5.database_name.dbo.Table_Flag(Uflag) values (0)

然后你可以在DB5-Database中为更新表创建一个触发器,它将更新Uflag 如果有任何新更新/插入/删除的行

,则为1

然后您可以将DB4中的作业修改为:

declare @count int

set @count  = (select count(*) fromDB5.database_name.dbo.Table_Flag where Uflag = 1)
if (@count > 1)
begin
TRUNCATE Table_Name
INSERT INTO Table_Name
SELECT field_name1,field_name2 ......
FROM DB5.database_name.table_Name

UPDATE DB5.database_name.dbo.Table_Flag SET Uflag = 0
end