2009-08-03 14 views
1

Ich versuche, eine Sicherungskopie einer Microsoft Dynamics NAV-Datenbank wiederherzustellen, die leider fehlschlägt, da sie versucht, einen CLUSTERED KEY für die Tabellen festzulegen, die bereits gruppierte Schlüssel enthalten.SQL Server 2005 - SQL-Anweisung zum Entfernen von Clusterschlüsseln aus Tabellen basierend auf einer Abfrage von Tabellennamen?

In NAV erhält jedes Unternehmen in der Datenbank eine eigene Kopie der Tabellen mit dem Präfix des Firmennamens, z. COMPANY$User_Setup. Ich möchte daher jeden geclusterten Schlüssel für eine bestimmte Firma entfernen, dh an jeder Tabelle, deren Name mit 'Firma $' beginnt.

Hat jemand eine SQL-Anweisung, die dies ausführen könnte?

Vielen Dank im Voraus!

Mit freundlichen Grüßen, Martin

Antwort

1

Sie müssen es als Cursor tun. Unter der Annahme, jeder PK Constraint consistantly genannt und basiert auf dem Tabellennamen, würden Sie in der Lage sein, etwas zu tun, wie (nicht getestet, so kann Tippfehler oder vauge Syntaxfehler enthalten):

DECLARE mycursor CURSOR FOR SELECT name FROM sysobjects WHERE name LIKE 'Company$%' 

OPEN CURSOR 
FETCH NEXT FROM mycursor INTO @tablename 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'ALTER TABLE QUOTENAME(' + @tablename + ') DROP CONSTRAINT PK_' + @tablename 
    EXEC sp_ExecuteSQL @sql 
    FETCH NEXT FROM mycursor INTO @tablename 
END 

CLOSE CURSOR 
DEALLOCATE CURSOR 

Wenn Ihr PK nicht sind Benannt basierend auf Tabellenname, dann müssen Sie dies ändern, um auch basierend auf sysconstraints oder sysindexes abzufragen, um den tatsächlichen PK-Namen zu erhalten.

+0

Das hilft, danke. Ich denke, ich kann damit anfangen. –

+3

Das wird es nicht tun - Sie entfernen nur die Einschränkung für den Primärschlüssel - das lässt den Index noch nicht fallen. Während der Primärschlüssel in der Regel der gruppierte Index ist, ist dies keine Voraussetzung - es könnten zwei verschiedene Indizes sein. Und noch mehr: Der Primärschlüssel (wenn es auch der Clustered-Index ist) wird normalerweise auch von Fremdschlüsselbeziehungen referenziert - also müssten diese auch gelöscht werden, bevor Sie den Primärschlüssel-Index fallen lassen können. –

+0

Wenn Sie normalerweise die PK-Einschränkung löschen, wird auch der zugehörige Index gelöscht. Allerdings gebe ich zu, einige Annahmen zu treffen, um es einfach zu halten ... aber um die Basis einer Lösung zu veranschaulichen, gibt es einen Ausgangspunkt. –