Scénář:
Pracujete jako SQL Server DBA nebo vývojář, potřebujete vypustit tabulku z databáze. Když provedete příkaz zrušení tabulky SchemaName.TableName, dostanete pod chybu.Msg 3726, Level 16, State 1, Line 12
Nelze zrušit objekt 'SchemaName.TableName', protože je odkazováno omezením FOREIGN KEY.
Nyní víme, že na tabulku odkazuje omezení cizího klíče. Problém je v tom, jak zjistit, která tabulka má omezení cizího klíče, které odkazuje na tuto tabulku.
Řešení:
1) Existuje mnoho způsobů, jak tyto informace získat. Můžeme použít systémové pohledy k nalezení názvu tabulky, která má omezení cizího klíče, které odkazuje na naši primární tabulku.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'
Spustil jsem výše uvedený skript pro moji tabulku zákazníků, která je přítomná ve schématu dbo, a tady je to, co jsem dostal.
Jak zjistit, který cizí klíč tabulky odkazuje na tabulku na serveru SQL. |
Nyní víme, že Ord je tabulka, která má omezení cizího klíče, které odkazuje na naši tabulku. Můžeme pokračovat a zahodit omezení cizího klíče a pak zahodit naši tabulku.
2) Použijte systémovou uloženou proceduru sp_fkeys
Můžeme použít systémovou uloženou proceduru k získání informací o omezeních cizího klíče, které odkazují na naši tabulku. Pokud je název mé tabulky Zákazník, mohu spustit skript, jak je uvedeno níže
EXEC sp_fkeys 'Customer'
Jak získat název omezení cizího klíče pro tabulku na serveru SQL |
Sp_fkeys vrací velmi podrobné informace, několik sloupců není zobrazeno na snímku výše. zde je seznam sloupců, které vrátí.
- 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
Video ukázka:Objekt nelze zrušit, protože na něj odkazuje omezení cizího klíče