![]() |
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
(unbekannte) Constraint löschen?!
Ich versuche gerade vergeblich eine Lösung zu finden, wie ich eine leider etwas unbekannte Constraint löschen kann... (welche implizit durch die Definition eines Default-Werts hinzugefügt wurde)
Mittlerweile bin ich soweit, dass ich mir so das SQL Statement basteln kann:
SQL-Code:
Dabei kommt dann folgendes heraus:
SELECT 'ALTER TABLE [Invoice] DROP CONSTRAINT ' + QUOTENAME(name) FROM sys.all_objects where name like 'DF__Invoice__Payed__%'
SQL-Code:
Das sollte jetzt jedoch gleich auch noch ausgeführt werden.
ALTER TABLE [Invoice] DROP CONSTRAINT [DF__Invoice__Payed__44FF419A]
Oder kann man die Constraint gleich irgendwie mit löschen?
SQL-Code:
<-- so jedenfalls nicht, da gibts folgende Meldung:
ALTER TABLE [Invoice] DROP COLUMN Payed;
Meldung 5074, Ebene 16, Status 1, Zeile 1 Das Objekt-Objekt 'DF__Invoice__Payed__44FF419A' ist vom Spalte-Objekt 'Payed' abhängig. Meldung 4922, Ebene 16, Status 9, Zeile 1 Fehler bei ALTER TABLE DROP COLUMN Payed, da mindestens ein Objekt auf diese Spalte zugreift. Damals wurde die Spalte so hinzugefügt:
SQL-Code:
Das "default 0" ist das Problem denk ich.
ALTER TABLE Invoice ADD Payed bit NOT NULL default 0;
|
Re: (unbekannte) Constraint löschen?!
Suche mal im Microsoft SQL Server Management Studio im Knoten zur Tabelle nach dem Knoten Constraint oder in der deutschen Version nach Einschränkungen. Dort kannst du dir 1. die Definition des Constraints ansehen und 2. ihn normalerweise auch löschen.
Grüße Mikhal PS: Es sollte dort auch die Möglichkeit geben, sich die SQL-Anweisung ausgeben zu lassen. |
Re: (unbekannte) Constraint löschen?!
Hi mikhal,
da das ist mir klar, dass ich das ding so löschen kann, aber ich möchte es eben dynamisch mit einem script machen bzw. muss es so machen, da ich nicht jedem Kunden zumuten kann so jetz gehen Sie erst mal in das SQL Management Studio in die Datenbank dann in die Tabelle und löschen manuell die Constraint.... Da wäre das in einem einzigen bequemen Updatestatement automatisiert besser.... ;) |
Re: (unbekannte) Constraint löschen?!
Was willst du eigentlich erreichen? Nur den Constraint löschen? Oder willst du beides löschen - den Constraint und das Feld?
Wenn du beides löschen willst, mußt du zuerst den Constraint und anschließend das Feld löschen. Dein erstes Select-Statement scheint ja bereits zu funktionieren, lese doch den Constraint-Namen in eine Variable, die du in dem Drop-Statement als Constraint-Name übergibst, führe das Drop-Statement aus und lösche dann genauso das Datenfeld. Grüße Mikhal |
Re: (unbekannte) Constraint löschen?!
Hallo,
in der 2005 Version zeigt der doch Man.-Console den SQL-Text mit an oder nicht. Ansonsten hilft viell. alter table tab_name drop constraint con_name #edit# ah, du kennstden Namen nicht genau. Dann mache es über eine stored procedure. Heiko |
Re: (unbekannte) Constraint löschen?!
@mikhal:
Ich will eigentlich nur das Feld löschen, aber um dieses zu löschen muss ich die vorhin von MSSQL automatisch erstellte Constraint noch löschen, dessen Namen ich eben nicht genau kenne. Mit obigem Statement find ich den Namen raus, nur weiss ich nicht wie ich eben das Ergebnis eines Statements wiederum als Statement ausführen kann... @hoika: Stored Procedure -- und wie erstelle ich eine stored procedure anhand des Ergebnisses eines SELECT-Statements? Oder wie meintest du das? Weil die einzige Idee die ich damit noch hätte, wäre das SELECT auszuführen und dann das Ergebnis [das eigentliche Lösungs-Statement] erneut programmatisch an die DB zu schicken... was ich aber für leicht unschön halte. Deswegen meine Frage hier, ob es nicht doch irgendwie anders geht ohne "drumherumprogrammieren zu müssen" sondern mit reinen SQL Bordmitteln zu lösen. |
Re: (unbekannte) Constraint löschen?!
Hallo,
ich hätte das über eine Datenbank-Update-Procedure gemacht, die von deinem Programm aus aufgerufen wird. Dort wird die SP anhand deines Selects erzeugt. Da ich von IB/FB komme, ging das nicht anderes. Mittlerweise kann ich in FB aber auch dynamisch Statements innerhalb einer SP ausführen. Zuerst wird der Name des Conatrains in eine lokale Variable gepackt. Dann das Statement ausgeführt. Unter MS-SQL sollte das auch gehen, wie die Syntax der SP ist, weiss ich aber nicht. Heiko |
Re: (unbekannte) Constraint löschen?!
Hallo Shivan,
aus einem ![]()
SQL-Code:
Grüße vom marabu
CREATE PROCEDURE [DBO].[GetConstraintName] (
@tablename sysname, @columnName sysname, @constraintName sysname OUTPUT ) AS SELECT @constraintName = o1.name FROM sysobjects o1 INNER JOIN syscolumns c ON o1.id = c.cdefault INNER JOIN sysobjects o2 ON o1.parent_obj = o2.id WHERE (o2.name = @tablename) AND (c.name = @columnName) |
Re: (unbekannte) Constraint löschen?!
Hi marabu,
DANKE! Hat perfekt geklappt. Statement insgesamt nun so:
SQL-Code:
CREATE PROCEDURE [DBO].[GetConstraintName] (
@tablename sysname, @columnName sysname, @constraintName sysname OUTPUT ) AS SELECT @constraintName = o1.name FROM sysobjects o1 INNER JOIN syscolumns c ON o1.id = c.cdefault INNER JOIN sysobjects o2 ON o1.parent_obj = o2.id WHERE (o2.name = @tablename) AND (c.name = @columnName) Declare @conName sysname exec GetConstraintName 'Invoice', 'Payed', @constraintName = @conName OUT declare @sql nvarchar(1024) set @sql = 'ALTER TABLE [Invoice] DROP CONSTRAINT ' + @conName exec(@sql) ALTER TABLE [Invoice] DROP COLUMN Payed; DROP PROCEDURE GetConstraintName; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz