Chcę napisać polecenie sql, aby usunąć wszystkie więzy we wszystkich tabelach. Szukałem w Internecie i znalazłem następujące, które działa dobrze, jeśli baza danych jest mała i nie jest skomplikowana.Jak usunąć wszystkie ograniczenia klucza obcego we wszystkich tabelach?
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)
DECLARE @schema VARCHAR(128)
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
SELECT @schema = (SELECT TOP 1 schema_name(schema_id) FROM sys.objects WHERE [name] = @name)
WHILE @name is not null
BEGIN
SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
WHILE @constraint IS NOT NULL
BEGIN
SELECT @SQL = 'ALTER TABLE ' + @schema + '.[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint) +']'
EXEC (@SQL)
PRINT 'Dropped FK Constraint: ' + @constraint + ' on ' + @name
SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY TABLE_NAME)
SELECT @schema = (SELECT TOP 1 schema_name(schema_id) FROM sys.objects WHERE [name] = @name)
END
GO
Nie działa, jeśli uruchomię go z bardziej złożoną bazą danych lub nawet z AdventureWork. Pokazuje niektóre eros, jak poniżej.
Msg 3728, Level 16, State 1, Line 1
'FK_ap_invoice_modification_type_id' is not a constraint.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.
Msg 3725, Level 16, State 0, Line 1
The constraint 'PK_ap_invoice' is being referenced by table '_drop_now_ap_invoice_detail', foreign key constraint 'FK_ap_invoice_detail_ap_invoice'.
Msg 3727, Level 16, State 0, Line 1
Could not drop constraint. See previous errors.
Powodem jest fakt, że niektóre odwołania do FK są tworzone przez inną tabelę. Muszę uruchomić ten skrypt kilka razy, dopóki baza danych nie będzie czysta.
Chcę wiedzieć, w jaki sposób wyczyścić wszystkie FK w bazie danych.
Według tytule chcesz usunąć klucze obce. Ale twoje ostatnie pytanie wymaga "oczyszczenia wszystkiego", w tym tabel, procedur składowanych, funkcji. Co masz na myśli mówiąc o tym? – Yaroslav
@Yaroslav Dziękuję za uwagę. Jestem pełnowymiarowy z zadaniami. Aktualizuję tylko szczegóły zapytania, aby dopasować je do tytułu. – Anonymous
Mimo to jestem pewien, że musiałeś sprawdzić na podobne pytania, ale chciałbym poprosić o ponowne przejrzenie rozwiązania tutaj: http://stackoverflow.com/a/1438933/1268844 – Anshu