Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi (unbekannte) Constraint löschen?! (https://www.delphipraxis.net/79646-unbekannte-constraint-loeschen.html)

Shivan 26. Okt 2006 00:32

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:
SELECT 'ALTER TABLE [Invoice] DROP CONSTRAINT ' + QUOTENAME(name) FROM sys.all_objects where name like 'DF__Invoice__Payed__%'
Dabei kommt dann folgendes heraus:
SQL-Code:
ALTER TABLE [Invoice] DROP CONSTRAINT [DF__Invoice__Payed__44FF419A]
Das sollte jetzt jedoch gleich auch noch ausgeführt werden.

Oder kann man die Constraint gleich irgendwie mit löschen?
SQL-Code:
ALTER TABLE [Invoice] DROP COLUMN Payed;
<-- so jedenfalls nicht, da gibts folgende Meldung:
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:
ALTER TABLE Invoice ADD Payed bit NOT NULL default 0;
Das "default 0" ist das Problem denk ich.

mikhal 26. Okt 2006 06:33

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.

Shivan 26. Okt 2006 07:22

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.... ;)

mikhal 26. Okt 2006 07:56

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

hoika 26. Okt 2006 07:58

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

Shivan 26. Okt 2006 08:49

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.

hoika 26. Okt 2006 09:41

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

marabu 26. Okt 2006 10:06

Re: (unbekannte) Constraint löschen?!
 
Hallo Shivan,

aus einem Artikel eines anderen Forums:

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)
Grüße vom marabu

Shivan 26. Okt 2006 21:00

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