Você pode fornecer a sintaxe para usar a exceção definida pelo usuário na função PostgreSQL?
Suponha que eu queira lidar com a exceção definida pelo usuário.
SQL Error [22023]: ERROR: password is too short.
Existem vários códigos de erro SQLSTATE, mas não é possível encontrar qual é o código SQLSTATE para este erro. Usei acima que é 22023 mas não resolveu.
Temos abaixo o código que podemos gerenciar a exceção relacionada à violação exclusiva, mas não podemos gerenciar "a senha é muito curta". poderia me ajudar com a sintaxe?
Código:
begin
EXECUTE 'ALTER USER ' || $1 || ' WITH PASSWORD '''|| $2||'''' ;
EXCEPTION WHEN "Password is too short"
THEN RAISE DETAIL 'Please check your password';
INSERT INTO pwdhistory (usename,password,changed_on) values($1,md5($2),now());
EXCEPTION WHEN unique_violation
THEN RAISE DETAIL 'Password already used earlier. Please try again with another password.';
end;
Capturando e levantando erros
Para interceptar erros , use apenas uma
EXCEPTION
cláusula no código PL/pgSQL. Pode ter váriasWHEN
cláusulas. (Mas você parece precisar apenas de um . Veja abaixo.)Você pode trabalhar com códigos de erro como com nomes de condição. A lista de códigos de erro pode ser encontrada no manual .
Considere também a página de manual do Postgres sobre interceptação de erros em PL/pgSQL :
Assim, você pode capturar erros e (re-)aumentá-los com detalhes diferentes ou adicionais.
Levantar seus próprios erros é uma questão diferente.
Basta usar
RAISE
com todos os detalhes desejados. Não é necessário interceptar um erro primeiro.injeção SQL
Não relacionado à sua pergunta principal, seu código exibido está aberto à injeção de SQL.
Não use isso.
Seria divertido chamar sua função com:
(Ou pior.) Boom. Ver:
Manipule a entrada do usuário corretamente. Ver:
Função
Sua função pode ficar assim (assumindo o Postgres 13 atual):
db<>fique aqui
Observe o uso de
format()
para citar corretamente o nome e o valor e defenda-se contra injeção de SQL.Ligar:
Produz:
Produz: