Para fins de registro, em uma tabela que desenvolvo, desejo armazenar as informações de IP dos usuários quando eles fizerem login.
Quando um usuário faz login, IPv4, IPv6 ou ambos os endereços IP devem ser armazenados. Mas quero definir uma restrição de que ambos não podem ser NULL.
É possível fazer isso no Standard SQL com restrições ou devo fazer usando PL/pgSQL no PostgreSQL ou na camada de negócios?
Vamos supor que a estrutura da sua tabela seja esta:
Você pode apenas adicionar um
CHECK
que garanta que umip_v4
ou não seja nulo, mas não ambosip_v6
(não faz sentido para mim ter um endereço v4 e um v6; você normalmente não usa os dois protocolos ao mesmo tempo) . Isso seria feito com a seguinte declaração:Se for razoável ter um endereço v4 e v6 ao mesmo tempo, a restrição a ser usada seria:
Como alternativa, dê uma olhada na extensão RhodiumToad/ip4r . Se você usá-lo, poderá representar
ip4
,ip6
ouipaddress
(que pode conter um endereço IPv4 ou IPv6) de maneira compacta e eficiente e ter uma coleção de operadores em endereços IP e intervalos de endereços IP. Eu realmente recomendo.Embora o PostgreSQL inclua o
inet
tipo de dados, que pode ser usado para armazenar endereços de internet (juntamente com máscaras de rede), aip4r
extensão oferece algumas vantagens se você precisar apenas de um endereço IP (sem máscara de rede). Uma das vantagens é uma representação mais compacta, que pode desempenhar um papel se o volume de dados a serem gravados for grande. Esta extensão é realmente útil se você precisar usarip ranges
. Um caso de uso seria unir a coluna IP dalog_logins
tabela a outra tabela contendo intervalos de IP (arbitrários) e os países aos quais eles correspondem.Sim. Isso é. Basta colocar uma restrição na tabela.
Ou você pode usar apenas o mesmo tipo (
inet
) que suportará ipv4 ou ipv6.Esta é a minha solução para sequenciar o arquivo de migração na função "up"