42 lines
1.2 KiB
Ruby
42 lines
1.2 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
class AddUpdateVulnerabilityReadsLocationTrigger < Gitlab::Database::Migration[1.0]
|
||
|
include Gitlab::Database::SchemaHelpers
|
||
|
|
||
|
TRIGGER_NAME = 'trigger_update_location_on_vulnerability_occurrences_update'
|
||
|
FUNCTION_NAME = 'update_location_from_vulnerability_occurrences'
|
||
|
|
||
|
def up
|
||
|
create_trigger_function(FUNCTION_NAME, replace: true) do
|
||
|
<<~SQL
|
||
|
UPDATE
|
||
|
vulnerability_reads
|
||
|
SET
|
||
|
location_image = NEW.location->>'image',
|
||
|
cluster_agent_id = NEW.location->'kubernetes_resource'->>'agent_id'
|
||
|
WHERE
|
||
|
vulnerability_id = NEW.vulnerability_id;
|
||
|
RETURN NULL;
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
execute(<<~SQL)
|
||
|
CREATE TRIGGER #{TRIGGER_NAME}
|
||
|
AFTER UPDATE ON vulnerability_occurrences
|
||
|
FOR EACH ROW
|
||
|
WHEN (
|
||
|
NEW.report_type IN (2, 7) AND (
|
||
|
OLD.location->>'image' IS DISTINCT FROM NEW.location->>'image' OR
|
||
|
OLD.location->'kubernetes_resource'->>'agent_id' IS DISTINCT FROM NEW.location->'kubernetes_resource'->>'agent_id'
|
||
|
)
|
||
|
)
|
||
|
EXECUTE PROCEDURE #{FUNCTION_NAME}();
|
||
|
SQL
|
||
|
end
|
||
|
|
||
|
def down
|
||
|
drop_trigger(:vulnerability_occurrences, TRIGGER_NAME)
|
||
|
drop_function(FUNCTION_NAME)
|
||
|
end
|
||
|
end
|