【问题标题】:How can I check if a SQL Server database engine is updating?如何检查 SQL Server 数据库引擎是否正在更新?
【发布时间】:2014-04-03 06:20:19
【问题描述】:

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

问题:问题是有时两个数据库引擎会同时更新它们的数据库,所以 DB4 不能完全更新。

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

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

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

【问题讨论】:

  • DB5 更新有什么特别之处吗,例如,它以特定用户的身份连接?
  • “更新”是什么意思?复制?
  • @Angst 我不知道,我无权访问 DB5。关于 DB5,我只知道它是一个交换数据库引擎,DB5 从其他地方更新,然后一些数据库引擎(如 DB4)会从中提取数据。
  • 好吧,如果您有权访问 DB4,并且您知道当 DB5 进行更新时,它会使用某个用户来执行此操作,您可以检查 DB4 中该用户是否存在会话.
  • @usr 有人在 SQL Server 代理中编写了许多脚本。基本上,它只是 TRUNCATE 一个表,然后从 DB5 SELECT 并 INSERT 到表中。通过这种方式,DB4 更新了它的所有数据库。

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


【解决方案1】:

您所说的 DB4、DB5 是指服务器而不是数据库,这里的名称令人困惑。 不过,如果您有权访问 DB4 并且 DB4 正在从 DB5 中进行选择,则意味着 DB5 是在 DB4 中注册的链接服务器,用户对 DB5 数据库具有查询权限并且可以具有插入/更新/删除/创建对象权限。如果是这样,那么您可以在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中的job修改为:

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

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多