Check-Einschränkung für die Herstellung sicher, dass ein Datum nicht in der Zukunft?
Ich versuche eine Tabelle erstellen, werden änderungen an den geschätzten Stunden der anderen Tabelle. Die Datenbank als ganzes ist ein Projekt-management-system für ein Unternehmen zu Arbeit zuweisen, um Ihre Mitarbeiter und erstellen Rechnungen für den Kunden.
Derzeit habe ich:
CREATE TABLE task_history
(
task_history_id NUMBER(5),
previous_est_hours NUMBER(3,1),
change_date DATE,
reason_for_change VARCHAR2(50),
task_id NUMBER(5),
CONSTRAINT TASKHIST_TASKHISTID_PK PRIMARY KEY (task_history_id),
CONSTRAINT TASKHIST_TASKID_FK FOREIGN KEY (task_id) REFERENCES task(task_id),
CONSTRAINT TASKHIST_TASKID_NN CHECK (task_id IS NOT NULL),
CONSTRAINT TASKHIST_CHANGEDATE_NONFUTURE CHECK (change_date <= sysdate)
);
change_date muss nicht sein, ein Datum in der Zukunft, muss es entweder heute oder in der Vergangenheit.
Der Letzte check-Einschränkung ist das problem. Wie ich es verstehe, können Sie nicht mithilfe der DATEPART-denn einen Grund habe ich vergessen, aber Sie können nicht. Ich habe auch versucht GETDATE() und jede andere Variante, die ich im Netz gefunden habe.
Wie kann ich das vermutlich einfache Aufgabe?
GETDATE()
ist der TSQL-spezifisch. SYSDATE
ist PLSQL-spezifische Mittel, um das aktuelle Datum und die Zeit, während CURRENT_TIMESTAMP
ist die ANSI-alternative (unterstützt von der Mehrheit der Datenbanken). Sind Sie tatsächlich auf einen Fehler? Denn dies ist der erste von dem ich gehört habe nicht mit der DATEPART -, so würde ich gerne mehr hören. Ihre version von Oracle würde auch helfen.InformationsquelleAutor solent_matt | 2011-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht eine Funktion aufzurufen, die aus einer check-Einschränkung, so dass die meisten natürlichen Ansatz wäre es, definieren Sie einen trigger für die task_history Tabelle, d.h.
> sysdate
D ' Oh. Ja, du hast Recht. Ich machte, dass die Korrektur.
InformationsquelleAutor Justin Cave
In 11g ist es möglich, die Verwendung von check-Einschränkungen mit DATEPART: http://rwijk.blogspot.com/2007/12/check-constraints-with-sysdate.html
Vor der 11g, die Sie verwenden sollten Justins Ansatz.
Grüße,
Rob.
InformationsquelleAutor Rob van Wijk
Das wäre wirklich problematisch, da eine Einschränkung.
Betrachten Sie, was passieren würde, wenn man, eine Zeile zu aktualisieren (andere Spalte) oder deaktivieren/reaktivieren des constraint. Es wird keine überprüfung gegen das ursprüngliche Datum, sondern gegen die
current
DATEPART!Ich würde es befürworten das hinzufügen einer weiteren Spalte der Tabelle, die standardmäßig auf der DATEPART-und Aufbau einer constraint oder TRIGGER, vergleichen Sie die neue Spalte (gespeichert DATEPART) gegen change_date.
InformationsquelleAutor RichardTheKiwi
Ich denke, dass können Sie eine Benutzer-definierte Funktion ausführt, überprüfen und verwenden Sie es in der check-Einschränkung.
So weit ich bin mir bewusst, Sie können nicht rufen Sie eine benutzerdefinierte Funktion aus einer check-Einschränkung
+1 weil es möglich ist, mit virtuellen Spalten
InformationsquelleAutor Antoine Aubry