AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi (unbekannte) Constraint löschen?!
Thema durchsuchen
Ansicht
Themen-Optionen

(unbekannte) Constraint löschen?!

Ein Thema von Shivan · begonnen am 26. Okt 2006 · letzter Beitrag vom 26. Okt 2006
Antwort Antwort
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#1

(unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 00:32
Datenbank: MSSQL • Version: 2005 • Zugriff über: ADO
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:
SELECT 'ALTER TABLE [Invoice] DROP CONSTRAINT ' + QUOTENAME(name) FROM sys.all_objects where name like 'DF__Invoice__Payed__%' Dabei kommt dann folgendes heraus:
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?
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:
ALTER TABLE Invoice ADD Payed bit NOT NULL default 0; Das "default 0" ist das Problem denk ich.
Markus Stein
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 06:33
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.
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 07:22
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....
Markus Stein
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 07:56
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
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#5

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 07:58
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
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 08:49
@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.
Markus Stein
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.275 Beiträge
 
Delphi 10.4 Sydney
 
#7

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 09:41
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
Heiko
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 10:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Shivan
Shivan

Registriert seit: 5. Mär 2003
Ort: Ravensburg
131 Beiträge
 
Delphi 6 Enterprise
 
#9

Re: (unbekannte) Constraint löschen?!

  Alt 26. Okt 2006, 21:00
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;
Markus Stein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz