2010-06-08 3 views
9

Ich pflege ein Produkt, das an mehreren Standorten installiert ist, die wie zufällig aktualisiert wurde. Eindeutige Einschränkungen wurden zu einer Anzahl von Tabellen hinzugefügt, aber ich habe keine Ahnung, was die Namen in einem bestimmten Fall sind. Was ich weiß, ist das Tabellen-/Spaltenname-Paar, das die eindeutigen Einschränkungen hat, und ich möchte ein Skript schreiben, um alle eindeutigen Integritätsbedingungen für diese Spalten/Tabellen-Kombinationen zu löschen.Ich muss eine eindeutige Einschränkungen entfernen, die ich nicht kenne die Namen

Dies ist SQL Server 2000 und höher. Etwas, das am 2000/2005/2008 funktioniert, wäre das Beste!

Antwort

5

Dieses Skript würde eine Liste von ALTER TABLE..... DROP CONSTRAINT.... erzeugen Befehle, die Sie dann zu kopieren + einfügen und ausführen (oder zwicken, bevor je nach Bedarf ausgeführt wird) alle eindeutigen Einschränkungen/unique-Indizes fallen zu lassen:

SELECT 
    'ALTER TABLE ' + OBJECT_NAME(so.parent_obj) + ' DROP CONSTRAINT ' + so.name 
FROM sysobjects so 
WHERE so.xtype = 'UQ' 

ich hoffe, dass es auf all SQL Server-Versionen 2000 bis 2008 funktionieren soll R2.

+0

Dies ist sehr nahe, aber ich darf nicht nach dem Namen der Spalte filtern, in der die Einschränkung angewendet wird. Ich werde einige Zeit damit verbringen, die Abfrage zu optimieren, danke! – Bill

+1

Tatsächlich gibt es sehr wenige Einschränkungen außer denen, die ich fallen lassen möchte. Ich werde das einfach benutzen, um sie alle fallen zu lassen und die paar, die ich brauche, neu zu erschaffen. Vielen Dank! – Bill

+0

Es scheint unmöglich zu sein, den Spaltennamen aus der sysobjects-Tabelle –

0

This page hat eine schnelle und schmutzige Art und Weise die CONSTRAINT s alle in der Datenbank zu ziehen, und von dort können Sie dynamische SQL aufbauen, um sie fallen:

SELECT OBJECT_NAME(OBJECT_ID) AS NameofConstraint, 
SCHEMA_NAME(schema_id) AS SchemaName, 
OBJECT_NAME(parent_object_id) AS TableName, 
type_desc AS ConstraintType 
FROM sys.objects 
WHERE type_desc LIKE '%CONSTRAINT'; 
+0

"sys.objects" wird nur ab 2005 funktionieren ... –

2

Dies ist viel kniffliger als es scheint, wie es sein sollte, fand ich einen Weg, der für mich funktioniert - ich glaube, dass es nur auf SQL Server 2005 oder höher funktioniert. Hier ist das vollständige Szenario:

Tabelle hat mit einer einzigartigen Einschränkung für eine Spalte erstellt wurde, ab:

CREATE TABLE table_name (
    id bigint identity not null, 
    column_name varchar(255) not null, 
    primary key(id), 
    unique (column_name) 
); 

später Irgendwann, es wird festgestellt, dass diese eindeutige Einschränkung nicht erwünscht ist.

INSERT INTO table_name(column_name) VALUES('col1'); 

Ergebnisse in: Verletzung der UNIQUE KEY Einschränkung 'UQ__table_na__9FA0BA59160F4887'. Kann keinen doppelten Schlüssel in Objekt 'dbo.table_name' einfügen.

Wenn Sie die manuelle Steuerung dieses db haben und SQL ausgeführt wird, kann direkt auf es möglich ist, tun gerade:

ALTER TABLE table_name DROP CONSTRAINT UQ__table_na__9FA0BA59160F4887; 

In meinem Fall, werden diese Skripte auf verschiedenen Umgebungen ausgeführt wurden und die Schlüssel gewonnen‘ Ich habe identische Namen. Um die Einschränkung zu entfernen, brauche ich SQL, das den Namen der Tabelle und der Spalte als Eingabe nimmt und den Rest auszählt.

Damit wird die eindeutige Einschränkung für die Spalte entfernt und der Vorgang kann fortgesetzt werden.

+0

Das letzte Bit ist perfekt, danke! –

Verwandte Themen