Du kan ikke tilføje en ikke-nul- eller check-begrænsning til en visning; se dette og på samme side 'Restrictions on NOT NULL Constraints' og 'Restrictions on Check Constraints'. Du kan tilføje en with check option
(mod en redundant where-klausul) til visningen, men den vil ikke blive markeret som not null
i dataordbogen.
Den eneste måde, jeg kan tænke på at få denne effekt på, er, hvis du er på 11g, at tilføje cast-værdien som en virtuel kolonne på bordet, og (hvis det stadig er nødvendigt) oprette visningen mod det:
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
Da du sagde i en kommentar på dba.se, at dette er for at håne noget, kan du bruge en normal kolonne og en trigger til at simulere den virtuelle kolonne:
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
Og desc "MyView"
giver stadig:
Name Null? Type
----------------------------------------- -------- ----------------------------
MyColumn NOT NULL BINARY_DOUBLE
Som Leigh nævnte (også på dba.se), hvis du ville indsætte/opdatere visningen, kunne du bruge en instead of
trigger, med VC eller falsk version.