Eu tenho vários aplicativos C# em que preciso garantir que haja apenas uma instância do aplicativo em execução em um determinado esquema.
Estou migrando do Oracle para o PostgreSQL 10.
No Oracle, eu executaria a seguinte consulta:
select sid, username, machine, program, logon_time
from sys.v_$session v
where status not in ('KILLED')
and upper('\' || machine) not like upper('%\' || :MACHINE)
and upper(username) = upper(:USERNAME)
and upper(program) = upper(:PROGRAM)
Eu uso Environment.MachineName em meus aplicativos para obter o valor do parâmetro MACHINE .
Eu reescrevi a consulta para o PostgreSQL da seguinte forma:
select pid, user, client_hostname, application_name, backend_start
from pg_stat_activity
where upper(state) not in ('KILLED')
and upper('\\' || client_hostname) not like upper('%\\' || :MACHINE)
and upper(user) = upper(:USERNAME)
and upper(application_name) = upper(:APPNAME)
Eu adicionei o ApplicationName à minha cadeia de conexão e habilitei a log_hostname
configuração no meu banco de dados para preencher as colunas application_name
e em , respectivamente.client_hostname
pg_stat_activity
O problema que me deparei é que, ao executar a aplicação em uma máquina virtual, a client_address
coluna mostra o endereço IP da máquina física que está hospedando a VM, não o endereço IP da máquina virtual e, portanto, client_hostname
está errado também .
Estou fazendo algo errado? Existe uma maneira de fazer com que meu aplicativo envie as informações corretas para o PostgreSQL ao conectar?