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
  

Mensagemem Seg, 01 Ago 2005 8:38 am

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

Código: Selecionar todos
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

Código: Selecionar todos
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

Código: Selecionar todos
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
João
Localização: Lisboa

Mensagemem Seg, 01 Ago 2005 11:34 am

Bem, de acordo com o erro:

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 ?
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Seg, 01 Ago 2005 12:44 pm

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 faze-lo, ou só é possível fazer actualizações e inserções de dados directamente nas tabelas?

Mais uma vez obrigado pela atenção
Cumprimentos
João
Localização: Lisboa

Mensagemem Seg, 01 Ago 2005 1:24 pm

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)
dr_gori
Localização: Portland, OR USA

Thomas F. G

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

Mensagemem Ter, 02 Ago 2005 5:29 am

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
João
Localização: Lisboa

Mensagemem Qua, 03 Ago 2005 8:41 am

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
dr_gori
Localização: Portland, OR USA

Thomas F. G

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


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


Voltar para SQL

Quem está online

Usuários navegando neste fórum: Google [Bot] e 1 visitante

cron