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.