Bonjour, y a t-il un moyen, sans utiliser de trigger, de réaliser ces contraintes :
1 - les tables en jeu :
2 - La première contrainte :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 CREATE TABLE T_CLIENT_CLI (CLI_ID INT NOT NULL PRIMARY KEY, CLI_REMISE_MAX FLOAT); CREATE TABLE T_COMMANDE_CMD (CMD_ID INT NOT NULL PRIMARY KEY, CLI_ID INT NOT NULL , CMD_REMISE NUMBER(5,2) DEFAULT(0) NOT NULL, CMD_DATE DATE DEFAULT SYSDATE, CONSTRAINT FK_CMD_CLI FOREIGN KEY (CLI_ID) REFERENCES T_CLIENT_CLI (CLI_ID));
Erreur rapporté : ORA-02251: sous-interrogation non autorisée ici
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ALTER TABLE T_COMMANDE_CMD ADD CONSTRAINT CK_CMD_REMISE CHECK (CMD_REMISE <= (SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM MIN(CMD_DATE)) FROM T_COMMANDE_CMD C WHERE C.CLI_ID = CLI_ID));
3 - La seconde contrainte :
Même punition...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 ALTER TABLE T_COMMANDE_CMD ADD CONSTRAINT CK_CMD_REMISE_MAX CHECK (CMD_REMISE <= (SELECT CLI_REMISE_MAX FROM T_CLIENT_CLI C WHERE C.CLI_ID = CLI_ID));
Est-ce possible sans trigger, via une UDF (fonction utilisateur) ?
Du genre :
Si oui, comment coder cela ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ALTER TABLE T_COMMANDE_CMD ADD CONSTRAINT CK_CMD_REMISE_MAX CHECK (CMD_REMISE <= F_REMISE_ANCIENNETE(CLI_ID)) ALTER TABLE T_COMMANDE_CMD ADD CONSTRAINT CK_CMD_REMISE_MAX CHECK (CMD_REMISE <= F_REMISE_MAX(CLI_ID))
A +
Partager