SQL 触发器递归级别太多
SQL Too many levels of trigger recursion
@http://www.mediafire.com/download/5h674s7wdzk8tek/m4_2013.db
我正在为上述数据库使用 sqlitestudiov3.01。问题是它不允许编辑数据值并引发错误
An error occurred while commiting the data: too many levels of trigger recursion
如果我放下触发器,这个错误就会得到解决。我的triiger如下
CREATE TRIGGER MACRO_A
AFTER UPDATE ON ELZ_A
FOR EACH ROW
BEGIN
UPDATE ELZ_A
SET CURRENT_DENSITY = ROUND( ( LOAD / 2.721 ) , 2 );
UPDATE ELZ_A
SET VOLTS_AVG = ROUND( ( VOLTS_T / ELEMENTS ) , 2 );
UPDATE ELZ_A
SET VOLTS_STNDR = ROUND( 2.4 +( ( 12.75 / 2.721 ) *( ( VOLTS_AVG - 2.4 ) / CURRENT_DENSITY ) ) -( ( 90 - CATHOLYTE_TEMP ) * 0.01 ) +( ( 32 - CATHOLYTE_CONC ) * 0.02 ) , 2 );
UPDATE ELZ_A
SET KF_FACTOR = ROUND( ( ( VOLTS_AVG -( 90 - CATHOLYTE_TEMP ) * 0.016 *( ( LOAD / 2.721 ) / 5 ) ) +( ( 32 - CATHOLYTE_CONC ) * 0.033 *( ( LOAD / 2.721 ) / 5 ) - 2.4 ) ) /( LOAD / 2.721 ) , 3 );
UPDATE ELZ_A
SET PRODUCTION = ROUND( 0.001492 * 24 * ELEMENTS * LOAD *( EFFICIENCY / 100 ) , 2 );
UPDATE ELZ_A
SET TEMP_CORRELATION = ROUND( 7 *( CURRENT_DENSITY / 3 ) *( 90 - CATHOLYTE_TEMP ) , 2 );
UPDATE ELZ_A
SET CONC_CORRELATION = ROUND( 14 *( CURRENT_DENSITY / 3 ) *( 32 - CATHOLYTE_CONC ) , 2 );
UPDATE ELZ_A
SET DC_POWER_PER_TON = ROUND( ( ( 24 * LOAD * VOLTS_T ) / PRODUCTION ) - TEMP_CORRELATION - CONC_CORRELATION, 0 );
END;
好吧,我不知道以上是否符合标准,但至少在某些应用程序中它可以完美运行并模仿 Excel 公式计算。任何有想法的人
此触发器在 任何 列更新时触发,因此它也会为本身更新的列触发。
如果您区分 "input" 和 "output" 列,其中只有后者由触发器计算,您可以限制触发器仅在输入列上触发:
CREATE TRIGGER ...
AFTER UPDATE OF LOAD, VOLTS_T, ELEMENTS, ... ON ...
但是,将派生值存储在数据库中并不是一个好主意。
最好使用视图动态计算派生值:
CREATE VIEW ELZ_with_all_values AS
SELECT LOAD,
VOLTS_T,
ELEMENTS,
...
LOAD / 2.721 AS CURRENT_DENSITY,
VOLTS_T / ELEMENTS AS VOLTS_AVG,
...
FROM ELZ_A;
请注意,您永远不应该对用于进一步计算的值使用 ROUND()。 (在 Excel 中,格式只会影响值的显示方式。)
@http://www.mediafire.com/download/5h674s7wdzk8tek/m4_2013.db 我正在为上述数据库使用 sqlitestudiov3.01。问题是它不允许编辑数据值并引发错误
An error occurred while commiting the data: too many levels of trigger recursion
如果我放下触发器,这个错误就会得到解决。我的triiger如下
CREATE TRIGGER MACRO_A
AFTER UPDATE ON ELZ_A
FOR EACH ROW
BEGIN
UPDATE ELZ_A
SET CURRENT_DENSITY = ROUND( ( LOAD / 2.721 ) , 2 );
UPDATE ELZ_A
SET VOLTS_AVG = ROUND( ( VOLTS_T / ELEMENTS ) , 2 );
UPDATE ELZ_A
SET VOLTS_STNDR = ROUND( 2.4 +( ( 12.75 / 2.721 ) *( ( VOLTS_AVG - 2.4 ) / CURRENT_DENSITY ) ) -( ( 90 - CATHOLYTE_TEMP ) * 0.01 ) +( ( 32 - CATHOLYTE_CONC ) * 0.02 ) , 2 );
UPDATE ELZ_A
SET KF_FACTOR = ROUND( ( ( VOLTS_AVG -( 90 - CATHOLYTE_TEMP ) * 0.016 *( ( LOAD / 2.721 ) / 5 ) ) +( ( 32 - CATHOLYTE_CONC ) * 0.033 *( ( LOAD / 2.721 ) / 5 ) - 2.4 ) ) /( LOAD / 2.721 ) , 3 );
UPDATE ELZ_A
SET PRODUCTION = ROUND( 0.001492 * 24 * ELEMENTS * LOAD *( EFFICIENCY / 100 ) , 2 );
UPDATE ELZ_A
SET TEMP_CORRELATION = ROUND( 7 *( CURRENT_DENSITY / 3 ) *( 90 - CATHOLYTE_TEMP ) , 2 );
UPDATE ELZ_A
SET CONC_CORRELATION = ROUND( 14 *( CURRENT_DENSITY / 3 ) *( 32 - CATHOLYTE_CONC ) , 2 );
UPDATE ELZ_A
SET DC_POWER_PER_TON = ROUND( ( ( 24 * LOAD * VOLTS_T ) / PRODUCTION ) - TEMP_CORRELATION - CONC_CORRELATION, 0 );
END;
好吧,我不知道以上是否符合标准,但至少在某些应用程序中它可以完美运行并模仿 Excel 公式计算。任何有想法的人
此触发器在 任何 列更新时触发,因此它也会为本身更新的列触发。
如果您区分 "input" 和 "output" 列,其中只有后者由触发器计算,您可以限制触发器仅在输入列上触发:
CREATE TRIGGER ...
AFTER UPDATE OF LOAD, VOLTS_T, ELEMENTS, ... ON ...
但是,将派生值存储在数据库中并不是一个好主意。 最好使用视图动态计算派生值:
CREATE VIEW ELZ_with_all_values AS
SELECT LOAD,
VOLTS_T,
ELEMENTS,
...
LOAD / 2.721 AS CURRENT_DENSITY,
VOLTS_T / ELEMENTS AS VOLTS_AVG,
...
FROM ELZ_A;
请注意,您永远不应该对用于进一步计算的值使用 ROUND()。 (在 Excel 中,格式只会影响值的显示方式。)