Ian*_*oyd 2 sql-server asynchronous sql-server-2000
如果用户将行插入表中,我希望SQL Server执行一些额外的处理 - 但不是在用户事务的上下文中.
例如,用户提供对文件夹的读访问权:
UPDATE Folders SET ReadAccess = 1
WHERE FolderID = 7
Run Code Online (Sandbox Code Playgroud)
就用户而言,我希望这是原子操作的结束.实际上我现在必须找到所有子文件和文件夹并给它们ReadAccess
.
EXECUTE SynchronizePermissions
Run Code Online (Sandbox Code Playgroud)
这是一个可能很长的操作(超过2秒).我想这个冗长的操作发生" 后来 ".它可能在0秒后发生,并且在碳单元有机会考虑之前,异步更新已完成.
如何在需要(即触发)时异步运行此必需操作?
在理想的是:
CREATE TRIGGER dbo.Folders FOR INSERT, UPDATE, DELETE AS
EXECUTEASYNCHRONOUS SynchronizePermissions
Run Code Online (Sandbox Code Playgroud)
要么
CREATE TRIGGER dbo.Folders FOR INSERT, UPDATE, DELETE AS
EXECUTE SynchronizePermissions WITH(ASYNCHRONOUS)
Run Code Online (Sandbox Code Playgroud)
现在这发生在触发器上:
CREATE TRIGGER dbo.Folders FOR INSERT, UPDATE, DELETE AS
EXECUTE SynchronizePermissions
Run Code Online (Sandbox Code Playgroud)
并且用户每次对Folders
表格进行更改时都被迫等待3秒钟.
我想过要在用户上创建一个每分钟运行一次的计划任务,并检查一个PermissionsNeedSynchronizing
标志:
CREATE TRIGGER dbo.Folders FOR INSERT, UPDATE, DELETE AS
UPDATE SystemState SET PermissionsNeedsSynchronizing = 1
Run Code Online (Sandbox Code Playgroud)
计划任务二进制文件可以检查此标志,如果标志打开则运行:
DECLARE @FlagValue int
SET @FlagValue = 0;
UPDATE SystemState SET @FlagValue = PermissionsNeedsSynchronizing+1
WHERE PermissionsNeedsSynchronizing = 1
IF @FlagValue = 2
BEGIN
EXECUTE SynchronizePermissions
UPDATE SystemState SET PermissionsNeedsSynchronizing = 0
WHERE PermissionsNeedsSynchronizing = 2
END
Run Code Online (Sandbox Code Playgroud)
计划任务的问题是: - 它可以运行的最快速度是每60秒 - 它是一个轮询解决方案 - 它需要一个可执行文件
我更喜欢的是SQL Server可以触发计划任务的方式:
CREATE TRIGGER dbo.Folders FOR INSERT, UPDATE, DELETE AS
EXECUTE SynchronizePermissionsAsychronous
CREATE PROCEDURE dbo.SynchronizePermissionsAsychronous AS
EXECUTE sp_ms_StartWindowsScheduledTask @taskName="SynchronousPermissions"
Run Code Online (Sandbox Code Playgroud)
这个问题是: - 没有sp_ms_StartWinodowsScheduledTask
系统存储过程
所以我正在寻找更好的解决方案的想法.
更新:前面的例子是一个问题,已经有五年没有好的解决方案了.3年前的一个问题是没有好的解决方案,我需要在插入/更新后更新元数据列.元数据在在线事务处理中计算时间太长,但我可以在3或5秒后出现:
CREATE TRIGGER dbo.UpdateFundsTransferValues FOR INSERT, UPDATE AS
UPDATE FundsTransfers
SET TotalOrderValue = (SELECT ....[snip]....),
TotalDropValue = (SELECT ....,[snip]....)
WHERE FundsTransfers.FundsTransferID IN (
SELECT i.FundsTransferID
FROM INSERTED i
)
Run Code Online (Sandbox Code Playgroud)
而我今天遇到的问题是在过渡插入或修改行之后异步更新某些元数据的方法:
CREATE TRIGGER dbo.UpdateCDRValue FOR INSERT, UPDATE AS
UPDATE LCDs
SET CDRValue = (SELECT ....[snip]....)
WHERE LCDs.LCDGUID IN (
SELECT i.LCDGUID
FROM INSERTED i
)
Run Code Online (Sandbox Code Playgroud)
更新2:我考虑过创建本机或托管的dll并将其用作扩展存储过程.问题是:
使用队列表,并使用不同的后台进程从队列中提取并处理它们.根据定义,触发器本身是用户事务的一部分 - 这正是他们经常被劝阻的原因(或者至少人们被警告不要在触发器中使用昂贵的技术).
归档时间: |
|
查看次数: |
6431 次 |
最近记录: |