1

I have this trigger. If the incoming log agrees with input filter, than is not saved into database. But, I want to keep number of "hits" of each Primitive_filter. I have a column named hit_rate, which is int(30). Is there some way how to do that? Maybe specific error? Or sth else? Thx for help.

UPDATE Primitive_filters SET hit_rate = hit_rate + 1 where Primitive_filters.id = ???;

trigger

delimiter //
CREATE TRIGGER inputFilter
before insert
on Logs
for each row
begin
declare msg varchar(255);
IF (SELECT COUNT(*) FROM Primitive_filters, Primitive_in_filter, Filters WHERE 
Filters.name = "input" AND Filters.id = Primitive_in_filter.id_filter AND Primitive_in_filter.id_primitive = Primitive_filters.id AND
(Primitive_filters.id_host LIKE CONCAT('%',(SELECT host FROM Hosts WHERE id = new.id_host),'%') OR Primitive_filters.id_host IS NULL) AND
(Primitive_filters.facility LIKE CONCAT('%',new.facility,'%') OR Primitive_filters.facility IS NULL) AND
(Primitive_filters.priority LIKE CONCAT('%',new.priority,'%') OR Primitive_filters.priority IS NULL) AND
(Primitive_filters.program LIKE CONCAT('%',new.program,'%') OR Primitive_filters.program IS NULL) AND
(new.msg REGEXP Primitive_filters.msg OR Primitive_filters.msg IS NULL)) > 0 THEN CALL raise_error; END IF; 
END //

delimiter ;
4

1 に答える 1

0

これはあなたの質問に対する答えではありません。

これは、コード内の潜在的に深刻なパフォーマンスの問題を修正する方法のヒントにすぎません。

これを使用しないでください:

IF (SELECT COUNT(*) FROM ... giant query ...) > 0 
THEN CALL raise_error; 
END IF; 

代わりにこれを使用してください:

IF EXISTS (SELECT 1 FROM ... giant query ...)
THEN CALL raise_error; 
END IF; 

前者の条件はカウントを計算します...クエリによって返されたすべての行を読み取る必要があり
ます 次に、クエリがカウントを返した後、チェックがあります。クエリが少なくとも1 つの行を返す場合は、何かを行います。give me a count of rows



後者の条件は、クエリが最初の行を返したときにクエリの実行を停止し、時間とリソースを節約します。

于 2013-10-17T22:21:01.170 に答える