schema: fix lost/diverged foreign keys

fixes #13591
This commit is contained in:
Thomas Gelf 2016-12-15 15:51:48 +01:00
parent 3d8ccf2448
commit 2918ef555e
4 changed files with 197 additions and 22 deletions

View File

@ -40,7 +40,7 @@ class Migration
try {
foreach ($queries as $query) {
if (preg_match('/^OPTIMIZE /i', $query)) {
if (preg_match('/^(?:OPTIMIZE|EXECUTE) /i', $query)) {
$db->query($query);
} else {
$db->exec($query);

View File

@ -1,21 +1,3 @@
ALTER TABLE icinga_service_set
DROP FOREIGN KEY icinga_service_set_host;
ALTER TABLE icinga_service_set
ADD FOREIGN KEY icinga_service_set_host (host_id)
REFERENCES icinga_host (id)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE icinga_service
DROP FOREIGN KEY icinga_service_service_set;
ALTER TABLE icinga_service
ADD CONSTRAINT icinga_service_service_set FOREIGN KEY (service_set_id)
REFERENCES icinga_service_set (id)
ON DELETE CASCADE
ON UPDATE CASCADE;
INSERT INTO director_schema_migration
(schema_version, migration_time)
VALUES (124, NOW());

View File

@ -0,0 +1,193 @@
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE()
AND table_name = 'icinga_service_set'
AND constraint_name = 'icinga_service_set_host'
)),
'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_host',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT 1
FROM information_schema.statistics
WHERE table_schema = SCHEMA()
AND table_name = 'icinga_service_set'
AND index_name = 'icinga_service_set_host'
)),
'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_host',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE()
AND table_name = 'icinga_service_set'
AND constraint_name = 'icinga_service_set_ibfk_1'
)),
'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_ibfk_1',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT 1
FROM information_schema.statistics
WHERE table_schema = SCHEMA()
AND table_name = 'icinga_service_set'
AND index_name = 'icinga_service_set_ibfk_1'
)),
'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_ibfk_1',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE()
AND table_name = 'icinga_service_set'
AND constraint_name = 'icinga_service_set_ibfk_2'
)),
'ALTER TABLE icinga_service_set DROP FOREIGN KEY icinga_service_set_ibfk_2',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT 1
FROM information_schema.statistics
WHERE table_schema = SCHEMA()
AND table_name = 'icinga_service_set'
AND index_name = 'icinga_service_set_ibfk_2'
)),
'ALTER TABLE icinga_service_set DROP INDEX icinga_service_set_ibfk_2',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE()
AND table_name = 'icinga_service'
AND constraint_name = 'icinga_service_service_set'
)),
'ALTER TABLE icinga_service DROP FOREIGN KEY icinga_service_service_set',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT 1
FROM information_schema.statistics
WHERE table_schema = SCHEMA()
AND table_name = 'icinga_service'
AND index_name = 'icinga_service_service_set'
)),
'ALTER TABLE icinga_service DROP INDEX icinga_service_service_set',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT * FROM information_schema.table_constraints
WHERE
table_schema = DATABASE()
AND table_name = 'icinga_service'
AND constraint_name = 'icinga_service_ibfk_1'
)),
'ALTER TABLE icinga_service DROP FOREIGN KEY icinga_service_ibfk_1',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
SET @stmt = (SELECT IF(
(SELECT EXISTS(
SELECT 1
FROM information_schema.statistics
WHERE table_schema = SCHEMA()
AND table_name = 'icinga_service'
AND index_name = 'icinga_service_ibfk_1'
)),
'ALTER TABLE icinga_service_set DROP INDEX icinga_service_ibfk_1',
'SELECT 1'
));
PREPARE stmt FROM @stmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @stmt = NULL;
ALTER TABLE icinga_service_set
ADD CONSTRAINT icinga_service_set_host
FOREIGN KEY host (host_id)
REFERENCES icinga_host (id)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE icinga_service
ADD CONSTRAINT icinga_service_service_set
FOREIGN KEY service_set (service_set_id)
REFERENCES icinga_service_set (id)
ON DELETE CASCADE
ON UPDATE CASCADE;
INSERT INTO director_schema_migration
(schema_version, migration_time)
VALUES (126, NOW());

View File

@ -541,8 +541,8 @@ CREATE TABLE icinga_service_set (
PRIMARY KEY (id),
UNIQUE KEY object_key (object_name, host_id),
CONSTRAINT icinga_service_set_host
FOREIGN KEY host (host_id)
REFERENCES icinga_host (id)
FOREIGN KEY host (host_id)
REFERENCES icinga_host (id)
ON DELETE CASCADE
ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
@ -1370,4 +1370,4 @@ CREATE TABLE sync_run (
INSERT INTO director_schema_migration
(schema_version, migration_time)
VALUES (125, NOW());
VALUES (126, NOW());