Scenariusz:
Pracujesz jako SQL Server DBA lub programista. Musisz usunąć tabelę z bazy danych. Po wykonaniu instrukcji drop table SchemaName.TableName pojawia się błąd poniżej.Msg 3726, Level 16, State 1, Line 12
Nie można usunąć obiektu 'SchemaName.TableName', ponieważ jest do którego odwołuje się ograniczenie klucza obcego.
Teraz wiemy, że do tabeli odwołuje się ograniczenie klucza obcego. Problem polega na tym, jak znaleźć, która tabela ma to ograniczenie klucza obcego, które odwołuje się do tej tabeli.
Rozwiązanie:
1) Istnieje wiele sposobów na uzyskanie tych informacji. Możemy użyć widoków systemowych, aby znaleźć nazwę tabeli, która ma ograniczenie klucza obcego, która odwołuje się do naszej tabeli podstawowej.SELECT Schema_Name(Schema_id) as TableSchemaName, object_name(FK.parent_object_id) ParentTableName, object_name(FK.referenced_object_id) ReferenceTableName FROM sys.foreign_keys AS FK WHERE object_name(FK.referenced_object_id)='YourTableName' and Schema_Name(Schema_id)='YourTableSchemaName'
Wykonałem powyższy skrypt dla mojej tabeli klientów, która jest obecna w schemacie dbo i oto, co mam.
Jak znaleźć klucz obcy tabeli, który odwołuje się do tabeli w SQL Server. |
Teraz wiemy, że Ord jest tabelą, która ma ograniczenie klucza obcego, które odwołuje się do naszej tabeli. Możemy iść dalej i usunąć ograniczenie klucza obcego, a następnie usunąć naszą tabelę.
2) Użyj procedury składowanej przez system sp_fkeys
Możemy użyć systemowej procedury składowanej, aby uzyskać informacje dotyczące ograniczeń klucza obcego, które odnoszą się do naszej tabeli. Jeśli moja nazwa tabeli to Klient, mogę uruchomić skrypt jak poniżej
EXEC sp_fkeys 'Customer'
Jak uzyskać nazwę ograniczenia klucza obcego dla tabeli w SQL Server |
Sp_fkeys zwraca bardzo szczegółowe informacje, kilka kolumn nie jest pokazanych na powyższym zrzucie. oto lista kolumn, które zostaną zwrócone.
- PKTABLE_QUALIFIER
- PKTABLE_OWNER
- PKTABLE_NAME
- PKCOLUMN_NAME
- FKTABLE_QUALIFIER
- FKTABLE_OWNER
- FKTABLE_NAME
- FKCOLUMN_NAME
- KEY_SEQ
- UPDATE_RULE
- DELETE_RULE
- FK_NAME
- PK_NAME
Wideo demonstracyjne:nie można usunąć obiektu, ponieważ odwołuje się do niego ograniczenie klucza obcego