【发布时间】:2018-03-08 02:58:51
【问题描述】:
我正在尝试将此 mssql 触发器转换为 mysql,但由于它已插入和删除逻辑表,我无法使其工作。
任何帮助或建议将不胜感激:)
CREATE trigger [dbo].[UpdateBuildCacheScenarioCounts] on [dbo].[ScenarioResults] after insert, update, delete as
SET NOCOUNT ON
declare buildidcur cursor fast_forward for (select [BuildId] from inserted group by [BuildId]) UNION (select [BuildId] from deleted group by [BuildId])
open buildidcur
declare @buildid [Int]
fetch next from buildidcur into @buildid
while @@FETCH_STATUS = 0
begin
--shonky attempt at preventing deadlocks
update [Builds] set
CacheTotalCount = (select Count(1) from ScenarioResults with (nolock) where [BuildId] = @buildId),
CachePassCount = (select Count(1) from ScenarioResults with (nolock) where [BuildId] = @buildId and [IsPassed] = 1)
where [Id] = @buildid
-- original, incase we need to rollback the NOLOCK
-- update [Builds] set CacheTotalCount = (select Count(1) from ScenarioResults where [BuildId] = @buildId) where [Id] = @buildid
-- update [Builds] set CachePassCount = (select Count(1) from ScenarioResults where [BuildId] = @buildId and [Passed] = 1) where [Id] = @buildid
fetch next from buildidcur into @buildid
end
close buildidcur
deallocate buildidcur
SET NOCOUNT OFF
我试过了,但没有为表 ScenarioResults 插入假值。
BEGIN
DECLARE buildid INT;
DECLARE done INT DEFAULT FALSE;
DECLARE buildidcur cursor FOR (select BuildId from ScenarioResults WHERE BuildId = NEW.BuildId group by BuildId ORDER BY CreatedAt DESC);
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN buildidcur;
myloop: LOOP
FETCH buildidcur INTO buildid;
IF done THEN LEAVE myloop;
END IF;
UPDATE Builds SET
CacheTotalCount = (SELECT COUNT(1) FROM ScenarioResults WHERE BuildId = buildId),
CachePassCount = (SELECT COUNT(1) FROM ScenarioResults WHERE BuildId = buildId AND IsPassed = 1) WHERE Id = buildid;
END LOOP;
CLOSE buildidcur;
END
【问题讨论】:
-
欢迎来到 Stack Overflow。这不是代码/SQL/正则表达式编写服务,您可以在其中发布您的要求和选择的语言列表,然后代码猴子会为您生成代码。我们非常乐意提供帮助,但我们希望您首先努力自己解决问题。完成后,您可以解释您遇到的问题,包括您工作的相关部分,并提出具体问题,我们会尽力提供帮助。祝你好运。
-
@KenWhite 实际上我确实花了 2 天时间。对不起,我没有提到它,但现在我已经编辑了这个问题。我不希望得到所有问题的答案,这也是我提出建议的原因。
-
不要声明与列名同名的变量名。
-
@P.Salmon 现在正在处理您使用不同变量名的建议:) 非常感谢您的帮助!最后!!! :)
标签: mysql sql sql-server triggers