Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment créer une colonne non nulle dans une vue

Vous ne pouvez pas ajouter une contrainte not null ou check à une vue; voir ceci et sur la même page 'Restrictions sur les contraintes NOT NULL' et 'Restrictions sur les contraintes de vérification'. Vous pouvez ajouter un with check option (contre une clause where redondante) à la vue mais qui ne sera pas marquée comme not null dans le dictionnaire de données.

La seule façon que je peux penser pour obtenir cet effet est, si vous êtes sur 11g, d'ajouter la valeur cast en tant que colonne virtuelle sur la table, et (si c'est toujours nécessaire) de créer la vue contre cela :

ALTER TABLE "MyTable" ADD "MyBDColumn" AS
    (CAST("MyColumn" AS BINARY_DOUBLE)) NOT NULL;

CREATE OR REPLACE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

desc "MyView"

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

Puisque vous avez dit dans un commentaire sur dba.se que c'était pour se moquer de quelque chose, vous pouvez utiliser une colonne normale et un déclencheur pour simuler la colonne virtuelle :

CREATE TABLE "MyTable" 
(
  "MyColumn" NUMBER NOT NULL,
  "MyBDColumn" BINARY_DOUBLE NOT NULL
);

CREATE TRIGGER "MyTrigger" before update or insert on "MyTable"
FOR EACH ROW
BEGIN
    :new."MyBDColumn" := :new."MyColumn";
END;
/

CREATE VIEW "MyView" AS
SELECT
    "MyBDColumn" AS "MyColumn"
FROM "MyTable";

INSERT INTO "MyTable" ("MyColumn") values (2);

SELECT * FROM "MyView";

  MyColumn
----------
  2.0E+000

Et desc "MyView" donne toujours :

 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

Comme Leigh l'a mentionné (également sur dba.se), si vous vouliez insérer/mettre à jour la vue, vous pouvez utiliser un instead of déclencheur, avec le VC ou la fausse version.