ORA-01779: non key-preserved

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
João
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 01 Ago 2005 7:55 am
Localização: Lisboa

Olá a todos

Será que alguém me poderá ajudar a encontrar uma solução para o bom funcionamento de uma query?

Tentei construir uma query, através do join de duas tabelas, que resultou para visualizar os dados previamente inseridos, mas acontece que quando tento inserir novos registos, e escrevo nos campos tblceramica.dimbordo e tblceramica.dimbase aparece-me a seguinte mensagem de erro: ORA-01779: não é possível modificar uma coluna que corresponde a uma tabela non key-preserved.

As tabelas e a query são as seguintes:

Tabela 1

Selecionar tudo

CREATE TABLE TBLARTEFACTO
(
  IDCODIGOARTEFACTO         NUMBER(11)          PRIMARY KEY,
  NUMEROINVENTARIONACIONAL  VARCHAR2(50 BYTE),
  NUMEROINVENTARIO          VARCHAR2(50 BYTE),
  IDCLASSE                  VARCHAR2(50 BYTE),
  IDCATEGORIA               VARCHAR2(50 BYTE),
  IDMATERIAL                VARCHAR2(50 BYTE),
  IDTIPOLOGIA               NUMBER(11),
  LOTE                      VARCHAR2(50 BYTE),
  NUMEROFRAGMENTOS          NUMBER(11)          DEFAULT 0,
  CRONOLOGIA                VARCHAR2(50 BYTE),
  COMPRIMENTO               FLOAT(22),
  ALTURA                    FLOAT(22),
  LARGURA                   FLOAT(22),
  ESPESSURA                 FLOAT(22),
  DIAMETRO                  FLOAT(22),
  PESO                      FLOAT(22),
  MARCAS                    VARCHAR2(50 BYTE),
  IDPROVENIENCIA            VARCHAR2(50 BYTE),
  IDDEPOSITO                VARCHAR2(50 BYTE),
  IDCOLOCACAO               VARCHAR2(50 BYTE),
  INCORPORACAO              VARCHAR2(50 BYTE),
  DATAINCORPORACAO          VARCHAR2(50 BYTE),
  DATASAIDA                 VARCHAR2(50 BYTE),
  IDESTATUTOPROPRIEDADE     VARCHAR2(50 BYTE),
  OBSERVACOES               CLOB,
  IDCODIGOCONTEXTO          VARCHAR2(50 BYTE),
  IDCODIGOACHADO            VARCHAR2(50 BYTE),
  IDCODIGODOACAO            VARCHAR2(50 BYTE)
)

Tabela 2

Selecionar tudo

CREATE TABLE TBLCERAMICA
(
  IDCODIGOARTEFACTO  NUMBER(11),	PRIMARY KEY
  DIMBORDO           FLOAT(22),
  DIMBASE            FLOAT(22)
)
ALTER TABLE TBLCERAMICA ADD (
  CONSTRAINT TBLCERAMICATBLARTEFACTO FOREIGN KEY (IDCODIGOARTEFACTO) 
    REFERENCES TBLARTEFACTO (IDCODIGOARTEFACTO));
View/Query

Selecionar tudo

CREATE OR REPLACE FORCE VIEW QRYCERAMICA
(IDCODIGOARTEFACTO, NUMEROINVENTARIONACIONAL, NUMEROINVENTARIO, IDCLASSE, IDCATEGORIA, 
 IDMATERIAL, IDTIPOLOGIA, LOTE, NUMEROFRAGMENTOS, CRONOLOGIA, 
 COMPRIMENTO, ALTURA, LARGURA, ESPESSURA, DIMBORDO, 
 DIAMETRO, DIMBASE, PESO, MARCAS, IDPROVENIENCIA, 
 IDDEPOSITO, IDCOLOCACAO, INCORPORACAO, DATAINCORPORACAO, DATASAIDA, 
 IDESTATUTOPROPRIEDADE, OBSERVACOES, IDCODIGOCONTEXTO, IDCODIGOACHADO, IDCODIGODOACAO)
AS 
SELECT   tblartefacto.idcodigoartefacto,
         tblartefacto.numeroinventarionacional, tblartefacto.numeroinventario,
         tblartefacto.idclasse, tblartefacto.idcategoria,
         tblartefacto.idmaterial, tblartefacto.idtipologia, tblartefacto.lote,
         tblartefacto.numerofragmentos, tblartefacto.cronologia,
         tblartefacto.comprimento, tblartefacto.altura, tblartefacto.largura,
         tblartefacto.espessura, tblceramica.dimbordo, tblartefacto.diametro,
         tblceramica.dimbase, tblartefacto.peso, tblartefacto.marcas,
         tblartefacto.idproveniencia, tblartefacto.iddeposito,
         tblartefacto.idcolocacao, tblartefacto.incorporacao,
         tblartefacto.dataincorporacao, tblartefacto.datasaida,
         tblartefacto.idestatutopropriedade, tblartefacto.observacoes,
         tblartefacto.idcodigocontexto, tblartefacto.idcodigoachado,
         tblartefacto.idcodigodoacao
    FROM tblartefacto LEFT JOIN tblceramica 
ON tblceramica.idcodigoartefacto = tblartefacto.idcodigoartefacto
   WHERE idcategoria = 'Cerâmica'
Obrigado pela atenção
Cumprimentos a todos
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Bem, de acordo com o erro:

Selecionar tudo

Error:  	ORA-01779: cannot modify a column which maps to a non-key-preserved table
Cause: 	You tried to INSERT or UPDATE columns in a join view which map to a non-key-preserved table.
Action: 	The options to resolve this Oracle error are:
   1. Try updating the tables directly.

Já tentou fazer isso que o manual diz? Inserir diretamente na tabela e não na VIEW ?
João
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 01 Ago 2005 7:55 am
Localização: Lisboa

Sim, se eu inserir directamente os dados na view funciona, acontece que esta view está ligada a um formulário construído no microsoft access, e o que se pretende é inserir os dados através do mesmo formulário.

Existe alguma forma de fazer-lo, ou só é possível fazer actualizações e inserções de dados directamente nas tabelas?

Mais uma vez obrigado pela atenção
Cumprimentos
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Funciona em views simples, sem muitos joins.
Normalmente, você só pode inserir informações nos campos da tabela principal da VIEW. (nos campos do join, não funciona)
João
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 01 Ago 2005 7:55 am
Localização: Lisboa

Então isso quer dizer que não é possivel ter um formulário para inserção de registos com base em mais que uma tabela?

De que forma é que posso resolver este problema? Pois se junto as tabelas numa só desnormalizo a estrutura do sistema.

Obrigado
Cumprimentos
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Olá João!!!

Desculpe, não sei todos os detalhes sobre as non key-preserved. Mas abaixo, deixo um link que poderá ajuda-lo:
CLIQUE_AQUI
Pra ter acesso, tem que ter uma conta no http://otn.oracle.com -> é gratis.

Vou deixar também o HTML dessa página aqui: Download_Zipado

Boa Sorte!!!
Manda pra gente o que você descobriu! :-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 15 visitantes