Hallo zusammen, ich habe eine Access-DB und darin eine Tabellenspalte, die eine Relation zu einer Spalte in einer anderen Tabelle hat. Diese Relation will ich programmatisch löschen, weil ich sonst diese Spalte nicht löschen kann. In Google habe ich dazu das statement
ALTER TABLE Orders DROP CONSTRAINT fk_PerOrders
gefunden. Leider kenne ich den Namen des Constraints aber nicht, und ich habe ihn auch nicht in der DB gefunden. Hat jemand eine Idee?
Führe mal die folgende Sub in Deiner Datenbank aus:
Sub ListRelations() Dim rel As DAO.Relation For Each rel In CurrentDb.Relations Debug.Print "RelationName: " & rel.Name & " ForeignTable: " & rel.ForeignTable & " Table " & rel.Table Debug.Print "Relation Fields:" For Each fld In rel.Fields Debug.Print fld.Name Next Next End Sub
Du erhälst alle Relationen, unter anderem wird Dir eine Guid angezeigt, pro Relation. Mit dieser kannst Du dann arbeiten:
ALTER TABLE TableName DROP CONSTRAINT [{0992AADA-3921-4AC0-8E95-745A87709D91}]
Danke, das bringt mich schon weiter. Ich bekomme aber den DAO-Workspace nicht hin, und den brauche ich, um das DB-Objekt zu erzeugen. Wir mache ich das? Ich arbeite in C#.
Oh Mann, wie doof kann man denns ein! Ich hatte das Statement zwar hingeschrieben, aber nicht ausgeführt. Klar wird dann die Relation nicht gelöscht. Also: kaum macht man es richtig, schon geht's! das ist doch ein guter Start ins Wochenende. Danke nochmal!
Falls in der Datatable ein Eintrag vorhanden ist, bei dem PK_COLUMN_NAME+PK_TABLE_NAME oder FK_COLUMN_NAME+FK_TABLE_NAME deiner gesuchten Spalte+Tabelle entspricht, steht in FK_NAME der Name des ForeignKey. Du musst das ALTER TABLE dann entweder auf PK_TABLE_NAME oder FK_TABLE_NAME machen, je nachdem wo du deine Spalte gefunden hast.
Du kannst auch 2 Abfragen zu GetOleDbSchemaTable machen:
Danke erh. Damit bekomme ich die gleichen Ergebnisse wie mit dem Script von JEwen. Leider kann ich aber mit dem, was ich als Relationsname interpretiere, die Relation auch nicht löschen (s. mein Kommentar zum Post von JEwen).
Ich nehme an, du brauchst VBA oder Interop. Du holst dir ein Datenbankobjekt, und hast Zugriff auf die Relations-Collection. Details in der Access-VBA-Referenz.