Fix foreign key constraints still exist after table flashback rename

This commit is contained in:
18523270951@163.com
2023-07-11 18:53:59 +00:00
committed by ob-robot
parent e269245733
commit 742766c42e

View File

@ -4398,9 +4398,11 @@ int ObTableSqlService::delete_foreign_key(
}
for (int64_t i = 0; OB_SUCC(ret) && i < foreign_key_infos.count(); i++) {
const ObForeignKeyInfo &foreign_key_info = foreign_key_infos.at(i);
if (is_truncate_table // truncate table will drop parent table and create it again
|| table_schema.is_offline_ddl_table() // offline ddl table will swap and drop parent table
|| table_schema.get_table_id() == foreign_key_info.child_table_id_) {
/*When the parent table or child table is deleted,
*the foreign key relationship should be deleted.
*If the parent table is deleted under foreign_key_checks=off,
*the foreign key relationship will be mocked by the child table
*/
uint64_t foreign_key_id = foreign_key_info.foreign_key_id_;
if (OB_FAIL(delete_from_all_foreign_key(sql_client, tenant_id, new_schema_version, foreign_key_info))) {
LOG_WARN("failed to delete __all_foreign_key_history", K(table_schema), K(ret));
@ -4409,7 +4411,8 @@ int ObTableSqlService::delete_foreign_key(
LOG_WARN("child column num and parent column num should be equal", K(ret),
K(foreign_key_info.child_column_ids_.count()),
K(foreign_key_info.parent_column_ids_.count()));
} else {
} else if (table_schema.get_table_id() == foreign_key_info.child_table_id_) {
//The column table needs to be updated only when the child table is deleted
for (int64_t j = 0; OB_SUCC(ret) && j < foreign_key_info.child_column_ids_.count(); j++) {
// delete from __all_foreign_key_column_history
uint64_t child_column_id = foreign_key_info.child_column_ids_.at(j);
@ -4421,7 +4424,6 @@ int ObTableSqlService::delete_foreign_key(
}
}
}
}
return ret;
}
@ -4533,35 +4535,15 @@ int ObTableSqlService::update_foreign_key_state(common::ObISQLClient &sql_client
// skip
} else {
dml.reset();
if (OB_FAIL(dml.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id(
exec_tenant_id, tenant_id)))
|| OB_FAIL(dml.add_pk_column("foreign_key_id", ObSchemaUtils::get_extract_schema_id(
exec_tenant_id, foreign_key_info.foreign_key_id_)))
|| OB_FAIL(dml.add_gmt_modified())
) {
LOG_WARN("failed to add columns", K(ret));
} else if (foreign_key_info.is_modify_enable_flag_ && OB_FAIL(dml.add_column("enable_flag", foreign_key_info.enable_flag_))) {
LOG_WARN("failed to add enable_flag column", K(ret));
} else if (foreign_key_info.is_modify_validate_flag_ && OB_FAIL(dml.add_column("validate_flag", foreign_key_info.validate_flag_))) {
LOG_WARN("failed to add validate_flag column", K(ret));
} else if (foreign_key_info.is_modify_rely_flag_ && OB_FAIL(dml.add_column("rely_flag", foreign_key_info.rely_flag_))) {
LOG_WARN("failed to add rely_flag column", K(ret));
} else if (foreign_key_info.is_modify_fk_name_flag_ && OB_FAIL(dml.add_column("foreign_key_name", foreign_key_info.foreign_key_name_))) {
LOG_WARN("failed to add foreign_key_name column", K(ret));
} else {
int64_t affected_rows = 0;
uint64_t table_id = foreign_key_info.table_id_;
if (OB_FAIL(exec_update(sql_client, tenant_id, table_id,
OB_ALL_FOREIGN_KEY_TNAME, dml, affected_rows))) {
LOG_WARN("exec update failed", K(ret));
} else if (affected_rows > 1) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error", K(affected_rows), K(ret));
}
if (OB_SUCC(ret)) {
dml.reset();
//UPDATE is not used to update __all_foreign_key because the parent table may have deleted the record in advance
if (OB_FAIL(gen_foreign_key_dml(exec_tenant_id, tenant_id, foreign_key_info, dml))) {
LOG_WARN("failed to gen foreign key dml", K(ret));
} else if (OB_FAIL(exec.exec_insert_update(OB_ALL_FOREIGN_KEY_TNAME, dml, affected_rows))) {
LOG_WARN("exec update failed", K(ret));
} else if (affected_rows > 2) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error", K(affected_rows), K(ret));
} else if (OB_FAIL(dml.add_column("schema_version", table.get_schema_version()))) {
LOG_WARN("add column failed", K(ret));
} else if (OB_FAIL(dml.add_column("is_deleted", false))) {
@ -4572,7 +4554,6 @@ int ObTableSqlService::update_foreign_key_state(common::ObISQLClient &sql_client
ret = OB_ERR_UNEXPECTED;
LOG_WARN("affected_rows unexpected to be one", K(affected_rows), K(ret));
}
}
if (OB_SUCC(ret)) {
if (OB_FAIL(update_data_table_schema_version(sql_client, tenant_id,
foreign_key_info.parent_table_id_, table.get_in_offline_ddl_white_list()))) {
@ -4581,7 +4562,6 @@ int ObTableSqlService::update_foreign_key_state(common::ObISQLClient &sql_client
}
}
}
}
return ret;
}
@ -5142,30 +5122,15 @@ int ObTableSqlService::update_foreign_key_in_mock_fk_parent_table(
for (int64_t i = 0; OB_SUCC(ret) && i < foreign_key_infos.count(); ++i) {
const ObForeignKeyInfo &foreign_key_info = foreign_key_infos.at(i);
dml.reset();
if (OB_FAIL(dml.add_pk_column("tenant_id", ObSchemaUtils::get_extract_tenant_id(exec_tenant_id, tenant_id)))
|| OB_FAIL(dml.add_pk_column("foreign_key_id", ObSchemaUtils::get_extract_schema_id(exec_tenant_id, foreign_key_info.foreign_key_id_)))
|| OB_FAIL(dml.add_gmt_modified())) {
LOG_WARN("failed to add columns", K(ret));
} else if (OB_FAIL(dml.add_column("parent_table_id", ObSchemaUtils::get_extract_schema_id(exec_tenant_id, foreign_key_info.parent_table_id_)))) {
LOG_WARN("failed to add parent_table_id column", K(ret));
} else if (OB_FAIL(dml.add_column("is_parent_table_mock", foreign_key_info.is_parent_table_mock_))) {
LOG_WARN("failed to add is_parent_table_mock column", K(ret));
} else if (OB_FAIL(dml.add_column("ref_cst_type", foreign_key_info.ref_cst_type_))) {
LOG_WARN("failed to add ref_cst_type column", K(ret));
} else if (OB_FAIL(dml.add_column("ref_cst_id", foreign_key_info.ref_cst_id_))) {
LOG_WARN("failed to add ref_cst_id column", K(ret));
} else {
int64_t affected_rows = 0;
if (OB_FAIL(exec.exec_update(OB_ALL_FOREIGN_KEY_TNAME, dml, affected_rows))) {
LOG_WARN("exec update failed", K(ret));
} else if (affected_rows > 1) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error", K(ret), K(affected_rows));
}
if (OB_SUCC(ret)) {
dml.reset();
//UPDATE is not used to update __all_foreign_key because the parent table may have deleted the record in advance
if (OB_FAIL(gen_foreign_key_dml(exec_tenant_id, tenant_id, foreign_key_info, dml))) {
LOG_WARN("failed to gen foreign key dml", K(ret));
} else if (OB_FAIL(exec.exec_insert_update(OB_ALL_FOREIGN_KEY_TNAME, dml, affected_rows))) {
LOG_WARN("exec update failed", K(ret));
} else if (affected_rows > 2) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("unexpected error", K(ret), K(affected_rows));
} else if (OB_FAIL(dml.add_column("schema_version", need_update_foreign_key_columns ? new_schema_version : new_mock_fk_parent_table_schema.get_schema_version()))) {
LOG_WARN("add column failed", K(ret));
} else if (OB_FAIL(dml.add_column("is_deleted", false))) {
@ -5177,8 +5142,6 @@ int ObTableSqlService::update_foreign_key_in_mock_fk_parent_table(
LOG_WARN("affected_rows unexpected to be one", K(affected_rows), K(ret));
}
}
}
}
return ret;
}