【问题标题】:Can't make SQL Server trigger work in MYSQL无法使 SQL Server 触发器在 MYSQL 中工作
【发布时间】: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


【解决方案1】:

触发器产生我期望的结果

DROP TRIGGER IF EXISTS T;
DELIMITER $$
CREATE TRIGGER T AFTER INSERT ON SCENARIORESULTS
FOR EACH ROW
BEGIN
DECLARE Vbuildid INT;
DECLARE VPASSED 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 Vbuildid;
    INSERT INTO DEBUG_TABLE(MSG,MSG2) VALUES (VBUILDID,VPASSED);
    IF done THEN 
        LEAVE myloop;
     END IF;
    UPDATE Builds 
     SET  CacheTotalCount = (SELECT COUNT(1) FROM ScenarioResults WHERE BuildId = VbuildId),
            CachePassCount = (SELECT COUNT(1) FROM ScenarioResults WHERE BuildId = VbuildId AND IsPassed = 1) WHERE Id = Vbuildid;
END LOOP;

CLOSE buildidcur;

END $$

DELIMITER ;

DROP TABLE IF EXISTS SCENARIORESULTS,BUILDS;
CREATE TABLE BUILDS(ID INT, CACHETOTALCOUNT INT,CACHEPASSCOUNT INT);

CREATE TABLE SCENARIORESULTS (BUILDID INT, ISPASSED INT);

MariaDB [sandbox]> TRUNCATE TABLE BUILDS;
Query OK, 0 rows affected (0.22 sec)

MariaDB [sandbox]> TRUNCATE TABLE SCENARIORESULTS;
Query OK, 0 rows affected (0.25 sec)

MariaDB [sandbox]> INSERT INTO BUILDS VALUES (1,NULL,NULL),(2,NULL,NULL);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |            NULL |           NULL |
|    2 |            NULL |           NULL |
+------+-----------------+----------------+
2 rows in set (0.01 sec)

MariaDB [sandbox]>
MariaDB [sandbox]> INSERT INTO SCENARIORESULTS VALUES (1,0);
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |               1 |              0 |
|    2 |            NULL |           NULL |
+------+-----------------+----------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> INSERT INTO SCENARIORESULTS VALUES (1,1);
Query OK, 1 row affected (0.08 sec)

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |               2 |              1 |
|    2 |            NULL |           NULL |
+------+-----------------+----------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> INSERT INTO SCENARIORESULTS VALUES (2,0);
Query OK, 1 row affected (0.03 sec)

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |               2 |              1 |
|    2 |               1 |              0 |
+------+-----------------+----------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> INSERT INTO SCENARIORESULTS VALUES (2,1);
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |               2 |              1 |
|    2 |               2 |              1 |
+------+-----------------+----------------+
2 rows in set (0.00 sec)

MariaDB [sandbox]> INSERT INTO SCENARIORESULTS VALUES (2,0);
Query OK, 1 row affected (0.02 sec)

MariaDB [sandbox]> SELECT * FROM BUILDS;
+------+-----------------+----------------+
| ID   | CACHETOTALCOUNT | CACHEPASSCOUNT |
+------+-----------------+----------------+
|    1 |               2 |              1 |
|    2 |               3 |              1 |
+------+-----------------+----------------+
2 rows in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 2017-06-01
    相关资源
    最近更新 更多