Pessoal…Estou usando um banco Oracle 10g xe. Hoje ocorreu uma coisa muito esquisita.
Por razões que ignoro, alguém que participa do meu projeto renomeou uma das tabelas do banco de dados para ’ (uma aspa simples). Esta operação foi feita através do Navicat. O Oracle aceitou o novo nome para a tabela. Quando me dei conta do ocorrido, tentei voltar ao nome anterior, mas o Oracle acusa o seguinte erro:
[b]
A operação em não foi bem-sucedida pelo seguinte motivo:
ORA-01741: identificador de tamanho zero inválido
[/b]
Bom…Então copiei a tabela e refiz os relacionamentos das tabelas que tinham chaves estrangeiras para ela (apontando esta cópia). Eu queria remover a tal tabela. Quando tentei remover, acusou o seguinte erro:
[b]
A operação de eliminação não foi bem-sucedida pelo seguinte motivo:
ORA-01756: string entre aspas não finalizada adequadamente
[/b]
Quer dizer, deve estar dando algum problema interno quando o Oracle roda o SQL de remoção da tabela, devido ao nome bizarro que ela tem. Alguém tem alguma ideia de como posso, pelo menos, remover a tal tabela? Alguém sabe se tem como desfazer alterações no esquema?
PS: Além de ficar espantado com o fato de alguém ter renomeado a tal tabela com esse nome (espero que tenha sido um acidente), espanta-me também o fato do Oracle aceitar um identificador de tabela que ele é incapaz de manipular internamente em seus SQL’s.
Talvez a aplicação Web esteja montando uma string SQL “no braço”. Se for isso que está acontecendo, ele deveria duplicar as aspas, quando elas aparecem em uma string (ou seja, quando aparece uma aspa simples, é necessário digitar duas vezes a aspa simples para que seja entendida apenas uma em SQL) Se não estiver fazendo isso, vai dar um erro de “string não terminada” mesmo.
Teoricamente a exceção “ORA-01741: identificador de tamanho zero inválido” significa que a coluna não foi passada (se for chutar que a palavra identificador = coluna).
Lina, basicamente é o seguinte. Esse é um caso particular que acho que o pessoal que fez a aplicação Web que serve para gerenciar o Oracle nunca testou (ou seja, pôr aspas ou outras porcarias em um nome de tabela).
Acho que eles usam concatenação de strings para montar o comando SQL (já que nomes de tabelas, conforme você deve saber, não podem ser passadas no equivalente aos PreparedStatements do Oracle. )
Só que quando há uma aspa em um nome de tabela, acho que é necessário duplicar essa aspa, e nesse caso a aplicação Web não deve ter sido testada para levar em conta esse caso especial.
O mais engraçado é que, há milhões de anos (quando eu ainda mexia muito casualmente com Oracle) não dava para ter tabelas com nomes esdrúxulos. Acho que só dava para usar letras, números e hífens ou “underscores” - não sei direito porque nesse tempo em que os dinossauros ainda nem existiam nunca vi uma tabela em que se usasse algo diferente de letras e números.
Acho que havia (e talvez ainda haja) uma limitação no tamanho de identificadores, acho que são 32 letras, dígitos e não sei que outros caracteres.
Não sei como está hoje.
[quote=entanglement]O mais engraçado é que, há milhões de anos (quando eu ainda mexia muito casualmente com Oracle) não dava para ter tabelas com nomes esdrúxulos. Acho que só dava para usar letras, números e hífens ou “underscores” - não sei direito porque nesse tempo em que os dinossauros ainda nem existiam nunca vi uma tabela em que se usasse algo diferente de letras e números.
Acho que havia (e talvez ainda haja) uma limitação no tamanho de identificadores, acho que são 32 letras, dígitos e não sei que outros caracteres.
Não sei como está hoje.
[/quote]
Oi,
hahahaha bem nessa!
O oracle aceita coisas estranhas na criação de suas tabela… Como por exemplo: $
Em relação ao tamanho dos identificadores, acredito que nos tempos modernos são 30.
O Oracle tem regras para identificadores, mas muitas delas podem ser ignoradas se colocar o nome do identificador entre aspas duplas (")
(O limite de 32 caracteres deve ser o tamanho da coluna na tabela interna, não dá pra mudar)
O problema é que toda hora que quiser referenciar esse objeto com nome estranho, terá de usar aspas duplas:
SELECT * FROM "'";
No seu caso para apagar a tabela, basta usar:
DROP TABLE "'"
Acho que na interface WEB tem uma espécie de console que você executa comandos diretamente.
Mas realmente, sempre fica a dúvida, para que permitir este tipo de coisa…