Naikniket Ответов: 1

Как проверить ограничение внешнего ключа не удалось по какой причине.


Я создал базу данных в sqlserver с несколькими таблицами, и почти каждая таблица связана с внешними ключами. Использование PHP CodeIgniter в качестве бэкенда
Теперь, согласно общему потоку, при удалении/обновлении базы данных записей проверяются внешние ключи, и если они не совпадают, это дает ошибку.
здесь я хочу показать пользователю правильное сообщение о том, почему внешний ключ не удался. Это означает, что если я пытаюсь удалить из родительской таблицы, а ссылка на нее существует во вторичной таблице, то вместо того, чтобы показывать длинное непонятное сообщение, Я хочу сначала показать сообщение типа "Вы должны удалить записи из <вторичной таблицы="">".

Моя структура таблицы такова,
таблица1 :
&ЛТ;user_master&ЛТ; б=""&ГТ;

Id, имя, адрес электронной почты,пароль

Таблица 1: User_details
идентификатор fk_user_master_id, адрес,телефон



Кроме того, если есть несколько внешних ключей, доступных для одной и той же таблицы, то я хочу показать список таблиц, которые будут конфликтовать с ключами.

Если точные записи из справочных таблиц, которые предотвращают удаление, также могут быть извлечены, то это будет здорово.

Что я уже пробовал:

Я успешно извлек внешние ключи, назначенные таблице, используя следующий запрос

SELECT 
   OBJECT_NAME(f.parent_object_id) TableName,
   COL_NAME(fc.parent_object_id,fc.parent_column_id) ColName
FROM 
   sys.foreign_keys AS f
INNER JOIN 
   sys.foreign_key_columns AS fc 
      ON f.OBJECT_ID = fc.constraint_object_id
INNER JOIN 
   sys.tables t 
      ON t.OBJECT_ID = fc.referenced_object_id
WHERE 
   OBJECT_NAME (f.referenced_object_id) = 'User_master'

1 Ответов

Рейтинг:
2

OriginalGriff

Внешние ключи позволяют SQL гарантировать, что база данных никогда не содержит "плохих" или несогласованных данных - она не позволит вам изменить информацию таким образом, чтобы внешний ключ "указывал" на запись, которая больше не существует.

Поэтому, если вы хотите удалить или изменить информацию, вам нужно сначала удалить или изменить строку внешнего ключа, а затем строку "target".

Таким образом, если у вас есть таблица счетов-фактур и таблица InvoiceLines, где каждая строка имеет внешний ключ обратно к соответствующей строке счета-фактуры, то вы удалили все строки из таблицы InvoiceLines, которые сначала ссылаются на "invoice nnnn", а затем удалили "invoice nnnn" из таблицы счетов-фактур.

Итак, во-первых, все это должно быть внутри транзакции, чтобы в случае сбоя вы могли откатиться назад и не потерять половину данных, а остальное оставить.

Во-вторых, внутри транзакции используйте ПРОБОВАТЬ...CATCH (Transact-SQL) - SQL Server | Microsoft Docs[^] для обнаружения проблемы, и вы можете использовать информацию об ошибке, предоставленную CATCH, чтобы сообщить о ней так, как вы хотите, прежде чем откатить транзакцию.


Naikniket

Да, вы правы, но здесь мой вопрос совсем другой. Я хочу показать пользователю настроенное сообщение, если ограничение внешнего ключа не работает. Это означает, что при удалении записи, если ссылка на эту запись существует во вторичной таблице, появляется сообщение о том, что у вас есть запись "number_of" в "secondary_table_name", сначала удалите ее.

OriginalGriff

Да - и вы используете информацию об ошибках, чтобы сделать это, это все, с чем вам нужно работать!