Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como criar uma coluna não nula em uma exibição


Você não pode adicionar uma restrição não nula ou de verificação a uma exibição; veja isto e na mesma página 'Restrições em restrições NOT NULL' e 'Restrições em restrições de verificação'. Você pode adicionar um with check option (contra uma cláusula where redundante) para a exibição, mas isso não será marcado como not null no dicionário de dados.

A única maneira que consigo pensar para obter esse efeito é, se você estiver no 11g, adicionar o valor de conversão como uma coluna virtual na tabela e (se ainda for necessário) criar a exibição contra isso:
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 você disse em um comentário no dba.se que isso é para simular algo, você pode usar uma coluna normal e um gatilho para simular a coluna 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

E desc "MyView" ainda dá:
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 MyColumn                                  NOT NULL BINARY_DOUBLE

Como Leigh mencionou (também em dba.se), se você quisesse inserir/atualizar a visualização, você poderia usar um instead of gatilho, com o VC ou versão falsa.