Pessoal,

No treinamento surgiu uma pergunta sobre VIEW’s, se é possível inserir (ou alterar) em uma VIEW e se segue todas as restrições da tabela que a originou, vamos ver nos SQL’s abaixo o que acontece.

Criar a tabela e inserir alguns registros:

Create table Teste1
(
coluna1 varchar(10),
coluna2 char(5),
coluna3 integer
);

insert into teste1
values
('0123456789','12345',1);

insert into teste1
values
('1123456789','12346',2);

insert into teste1
values
('2123456789','12347',3);

insert into teste1
values
('3123456789','12348',4);

Commit;

desc teste1;

Criar a view e iniciar os testes:

Create view view1 as
Select coluna1, coluna2, coluna3
from teste1;

insert into view1
values
('4123456789','12349',5);

insert into view1
values
('5123456789','12340',6);

insert into view1
values
('00123456789','02340',7);
#Error Code: 1406. Data too long for column ‘coluna1’ at row 1

insert into view1
values
('0123456780','123400',7);
#Error Code: 1406. Data too long for column ‘coluna2’ at row 1

desc view1;
#Mesmas definições da tabela;

alter table teste1 add column coluna4 varchar(5) not null default 'N';
#Coloquei default pois como é NOT NULL e já existem registros precisam iniciar com algo

alter table teste1 modify coluna4 varchar(5) not null;
#Alterando a tabela pare não ter mais default

insert into view1
values
('0123456780','52345',7);
#Error Code: 1423. Field of view ‘test.view1’ underlying table doesn’t have a default value

Create or replace view view1 as
Select coluna1, coluna2, coluna3, coluna4
from teste1;

insert into view1
values
('0123456780','52345',7,'FOI!');

Commit;

alter table teste1 add primary key teste1_pk1 (coluna3);

insert into view1
values
('0123456780','52345',7,'FOI!');
#Error Code: 1062. Duplicate entry ‘7’ for key ‘PRIMARY’

Bem, então podemos ver que sim, respeita todas as restrições da tabela utilizada na criação da VIEW.

Obs.: Os testes foram realizados no Workbench e também podem ser feitos no prompt do MySQL sem problemas.

Acredito que deva funcionar para Oracle também sem problemas, para executar o teste em Oracle precisamos somente alterar o VARCHAR para VARCHAR2.

Melhoria:

Segue scripts para os alter em Oracle:
– Add/modify columns
alter table TESTE1 add coluna4 varchar(5) default ‘N’ not null;
alter table TESTE1 modify coluna4 default null;

– Create/Recreate primary, unique and foreign key constraints
alter table TESTE1
add constraint teste1_pk1 primary key (COLUNA3);

Att,
capin