Situação bastante obscura e algumas horas tentando coisas diferentes sem sorte.
Eu tenho um script bash que restaura um backup de banco de dados de produção localmente. Parte do script executa algum SQL para definir coisas no banco de dados.
Um desses itens é definir o correto slack_token
em uma slack_details
tabela. Aqui está como eu executo o script bash:
$ ./restore-prod-database.sh -t "xoxb-1234567-1234....."
O script tem uma linha que aciona a execução de um arquivo .sql como este:
psql -h $DATABASE_HOST -d $DATABASE_NAME -a -v slack_token=$SLACK_TOKEN -f restore-populate-slack-details.sql
Finalmente, o SQL faz algo assim:
UPDATE slack_details
SET installation = jsonb_set(installation, '{bot,token}', ('"' || :slack_token ||'"')::jsonb)
WHERE id = 1;
Não importa o que eu tente, seja concatenando o :slack_token com aspas, passando-o com aspas, usando aspas simples e "Recebo o seguinte erro:
ATUALIZAÇÃO slack_details SET instalação = jsonb_set(instalação, '{bot,token}', ('"' || :slack_token ||'"')::jsonb) WHERE id = 1; psql:restore-populate-slack-details.sql:61: ERRO: a coluna "xoxb" não existe LINHA 2: ... = jsonb_set(instalação, '{bot,token}', ('"' || xoxb- 12345...
Nota rápida, a instalação é uma coluna jsonb e o código a seguir funciona bem, no momento em que uso a variável -v não funciona:
UPDATE slack_details
SET installation = jsonb_set(installation, '{bot,token}', ('"' || '123456' ||'"')::jsonb)
WHERE id = 1; --- works fine
Para injetar a
:slack_token
variável como literal na consulta SQL, a sintaxe adequada a ser usada é:'slack_token'
.Na documentação do psql em "interpolação SQL":
A consulta poderia ser escrita como:
Além disso, conforme comentado abaixo por @jjanes, a construção do valor jsonb deve ser simplificada e tornada mais segura usando
to_jsonb
, caso contrário, a falta de aspas dentro do token pode levar a strings json inválidas com determinados valores de:slack_token
: