Frage

Ich habe eine Datenbank-Anwendung, in der eine Gruppe wie folgt modelliert:

TABLE Group
(
  group_id integer primary key,
  group_owner_id integer
)

TABLE GroupItem
(
  item_id integer primary key,
  group_id integer,
  group_owner_id integer,
  Foreign Key (group_id, group_owner_id) references Group(group_id, group_owner_id)
)

Wir haben einen Multi-Feld Fremdschlüssel einschließlich der group_owner_id einzurichten, weil wir, dass ein GroupItem sicherstellen wollen, nicht einen anderen Eigentümer als die Group hat es in. Aus anderen Gründen (ich glaube nicht, dass ich ins Detail gehen muß auf diesem) kann die group_owner_id nicht aus der GroupItem Tabelle entfernt werden, so dass nur das Entfernen es keine Option ist.

Mein großes Problem ist, wenn ich die group_owner_id für die gesamte Gruppe aktualisieren will, ich Code wie diesen zu schreiben (in Pseudo-Code):

...
BeginTransaction();
BreakForeignKeys(group_items);
SetOwnerId(group, new_owner_id);
SaveGroup(group);
SetOwnerId(group_items, new_owner_id);
SetForeignKeys(group_items, group);
SaveGroupItems(group_items);
CommitTransaction()
...

Gibt es eine Möglichkeit, dies um zu tun? Es scheint ein bisschen klobig. Hoffentlich habe ich genug Detail geschrieben.

Danke.

War es hilfreich?

Lösung

Ist SQL Server nicht UPDATE CASCADE unterstützen? : -

Foreign Key (group_id, group_owner_id)
 references Group(group_id, group_owner_id)
 ON UPDATE CASCADE

Dann aktualisieren Sie einfach die group_owner_id der Gruppe Tabelle.

Andere Tipps

Tony Andrew Vorschlag funktioniert. Zum Beispiel, sagen Sie den Eigentümer der Gruppe ändern 1 von 2 bis 5 mögen Wenn ON UPDATE CASCADE aktiviert ist, diese Abfrage:

update [Group] set group_owner_id = 5 where group_id = 1

automatisch alle Zeilen in GroupItem aktualisieren.

Wenn Sie keine Kontrolle über die Indizes und Schlüssel in der Datenbank, können Sie dieses Problem umgehen, indem man zuerst die neue Gruppe eingeführt wird, dann werden alle Zeilen in der abhängigen Tabelle ändern, und schließlich die ursprüngliche Gruppe zu löschen:

insert into [Group] values (1,5)
update [GroupItem] set group_owner_id = 5 where group_id = 1
delete from [Group] where group_id = 1 and group_owner_id = 2

Durch die Art und Weise, GROUP ist ein SQL-Schlüsselwort und kann nicht ein Tabellenname sein. Aber ich nehme an, Ihre realen Tabellen echte Namen haben so dies kein Problem ist.

Sie könnten versuchen, eine Fortschreibungsregel kaskadieren Änderungen hinzuzufügen.

Microsoft Links
Fremdschlüsselbeziehungen Dialogfeld (siehe Update-Regel)
Gruppierung Änderungen an Verwandten Zeilen mit logischen Datensatz

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top