Da Sie weichen Löschungen durchführen möchten, können Sie erreichen, was Sie wollen, indem Sie einige zusätzliche Helfer Hinzufügen von Spalten und Fremdschlüssel:
create table Books (
Id uniqueidentifier primary key,
Title varchar(255) not null,
Author varchar(255) not null,
Deleted datetime null,
_DelXRef as CASE WHEN Deleted is null then 0 else 1 END persisted,
constraint UQ_Books_DelXRef UNIQUE (Id,_DelXRef)
)
create table Categories (
Id uniqueidentifier primary key,
Name varchar(255) not null,
Deleted datetime null,
_DelXRef as CASE WHEN Deleted is null then 0 else 1 END persisted,
constraint UQ_Categories_DelXRef UNIQUE (Id,_DelXRef)
)
create table BookCategories (
BookId uniqueidentifier not null,
CategoryId uniqueidentifier not null,
_DelXRef as 0 persisted,
constraint FK_BookCategories_Books foreign key (BookID) references Books(Id),
constraint FK_BookCategories_Books_DelXRef foreign key (BookID,_DelXRef) references Books(Id,_DelXRef),
constraint FK_BookCategories_Categories foreign key (CategoryId) references Categories(Id),
constraint FK_BookCategories_Categories_DelXRef foreign key (CategoryId,_DelXRef) references Categories(Id,_DelXRef)
)
Hoffentlich können Sie sehen, Wie die Fremdschlüssel sicherstellen, dass die _DelXRef
Spalten in den referenzierten Tabellen immer 0
bleiben müssen, und so ist es nicht möglich, Deleted
auf einen anderen Wert als NULL zu setzen, während die Zeile aus der Tabelle BookCategories
referenziert wird.
(An dieser Stelle ist der „Original“ Fremdschlüssel, FK_BookCategories_Books
und FK_BookCategories_Categories
erscheint überflüssig sein. Ich ziehe sie in dem Modell zu halten, die wirklichen FK Beziehungen zu dokumentieren. Ich bin auch meine eigene Konvention von prefixing Objekten mit mit _
, wo es nicht beabsichtigt, dass sie den Benutzer der Datenbank verwendet werden - sie existieren einfach DRI zu erlauben, zu vollstreck)
„, wenn ich Artikel löschen, ich nicht, sie tatsächlich löschen, sondern setzen Eigenschaft gelöscht Terminzeit." Dann müssen Sie einen 'UPDATE' Trigger verwenden; Einschränkungen werden dir nicht helfen. –
Was meinst du mit Update-Trigger? @ JeroenMostert – aiden87
Ich werde meine 5 Cent hinzufügen.Was @JeroenMostert bedeutet, dass Sie den Datensatz nicht physisch löschen, so wird der Fremdschlüssel (der von den Leuten vorgeschlagen wird) auf diese Weise nicht helfen und der einzige Weg, den Sie erreichen können, besteht darin, TRIGGER nicht mit CONSTRAINT zu verwenden. Dort müssen Sie die Logik implementieren, die prüft, ob Datensätze vorhanden sind, die sie verwenden. –