Criei uma view atualizável V1
em um banco de dados Oracle 11g (tem INSTEAD OF
triggers para UPDATE
, DELETE
e INSERT
); originalmente tinha uma GROUP BY
consulta, que movi para outra exibição V2
. Essa outra visão é unida na minha visão V1
, tornando a visão V1
atualizável do Oracle.
Eu crio uma tabela externa em um banco de dados PostgreSQL a partir da visualização Oracle V1
usando oracle_fdw ; OPTIONS (key 'true')
é definido para a coluna de chave primária.
Espero que a tabela estrangeira seja atualizável, mas recebo este erro:
Erro ao sincronizar dados com o banco de dados
Motivo: SQL-Fehler [HV00L]: ERRO: erro ao executar a consulta: OCIStmtExecute falhou ao executar a consulta remota Detalhe: ORA-02014: não é possível selecionar FOR UPDATE na visualização com DISTINCT, GROUP BY, etc. na visualização com DISTINCT, GROUP BY,
etc. .
Existe uma maneira de dizer ao oracle_fdw para permitir a atualização da tabela estrangeira? Como mencionado, UPDATE
na visão V1
funciona bem do lado do Oracle.
SELECT ... FOR UPDATE
(do lado do Oracle) falha com o mesmo erro ORA-02014.
Acho que tudo se resume a impedir que o oracle_fdw faça um SELECT FOR UPDATE
na exibição ao UPDATE
acessar a tabela estrangeira, mas a documentação parece sugerir que esse processamento linha por linha é projetado para wrappers de dados estrangeiros.
Então, há uma maneira? Ou tenho que colocar minhas INSTEAD OF
triggers em uma view do lado do PostgreSQL e apenas mapear as tabelas base do Oracle como tabelas estrangeiras?
Não, isso não é possível. Como você mencionou corretamente, isso
UPDATE
acontece em duas partes: primeiro, a coluna da chave primária é buscada comSELECT ... FOR UPDATE
, então cada linha que precisa ser alterada é atualizada individualmente.É teoricamente possível evitar isso realizando a atualização na primeira fase (scan) e não fazendo nada na segunda fase, mas isso não é trivial e não há planos para implementá-lo.