Idéia? Eu faço assim.
Para atualização do software. Tenho um PHP numa área administrativa que me permite fazer upload de novos releases. Ao fazer o upload de um release eu atualizo manualmente o número da versão. No cliente tem um executável extra que chama o executável principal. Ele confere a versão na web e se for maior que a corrente, ele baixa a versão da web. Na verdade minha solução é um pouco mais complexa que isso pois considera um repositório local e um controle de licenças.
No código é simples. IdHttp.get para descobrir a versão. IdFTP para baixar e uma funçãozinha trivial para descobrir a versão do executável. O resto é controle de licença e segurança.
Para atualização do banco de dados. É meu software principal que faz, ao acessar o sistema e conectar no bd, antes mesmo da tela de login, ele faz uma consulta numa tabela que tem um campo chamado VERSAO_DB. Se a versão esperada pela aplicação for maior, ele começa a rodar os scripts de atualização. Basicamente uso ZSQLScript e cada rotina de atualização está numa função separada, assim se eu precisar de uma atualização mais inteligente que faça um laço numa tabela ou algo assim e não quiser criar uma SP para isso, posso fazer client-side. Ao final de cada função, VERSAO_DB é incrementado até atingir a versão correta.
Este campo também tem o efeito de, se a versao_db do banco for maior que a versao_db esperada, a aplicação não roda pois o banco já espera uma versão mais nova da aplicação. Tecnicamente, ZSQLScript para rodar os scripts que são escritos no próprio código. E uma função para cada versão. Uso basicamente uma estrutura assim:
if versao_db < 120 then atualiza120();
if versao_db < 121 then atualiza121();
e por aí vaí....
[]'s