sql >> Base de Datos >  >> RDS >> Oracle

Cómo crear una columna no nula en una vista

No puede agregar una restricción no nula o de verificación a una vista; vea esto y en la misma página 'Restricciones en restricciones NOT NULL' y 'Restricciones en restricciones de verificación'. Puede agregar un with check option (contra una cláusula where redundante) a la vista, pero eso no se marcará como not null en el diccionario de datos.

La única forma que se me ocurre para obtener este efecto es, si está en 11g, agregar el valor de conversión como una columna virtual en la tabla y (si aún es necesario) crear la vista contra eso:

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

Como dijo en un comentario en dba.se que esto es para simular algo, podría usar una columna normal y un disparador para simular la columna virtual:

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

Y desc "MyView" todavía da:

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

Como mencionó Leigh (también en dba.se), si quisiera insertar/actualizar la vista, podría usar un instead of activador, con la versión VC o falsa.