AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 160343
Accepted
ukll
ukll
Asked: 2017-01-09 12:41:52 +0800 CST2017-01-09 12:41:52 +0800 CST 2017-01-09 12:41:52 +0800 CST

É possível definir uma restrição composta NOT NULL no PostgreSQL

  • 772

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?

postgresql constraint
  • 3 3 respostas
  • 4958 Views

3 respostas

  • Voted
  1. Best Answer
    joanolo
    2017-01-09T12:53:54+08:002017-01-09T12:53:54+08:00

    Vamos supor que a estrutura da sua tabela seja esta:

    CREATE  TABLE log_logins 
    (
        user_id INTEGER NOT NULL,
        login_time TIMESTAMP NOT NULL DEFAULT now(),
        ip_v4 TEXT /* or any other representation */,
        ip_v6 TEXT /* or any other representation */,
        PRIMARY KEY (user_id, login_time) 
    ) ;
    

    Você pode apenas adicionar um CHECKque garanta que um ip_v4ou 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:

    ALTER TABLE log_logins
      ADD CONSTRAINT one_and_only_one_of_ip_v4_or_ip_v6
      CHECK ((ip_v4 IS NULL) <> (ip_v6 IS NULL));
    

    Se for razoável ter um endereço v4 e v6 ao mesmo tempo, a restrição a ser usada seria:

    ALTER TABLE log_logins
      ADD CONSTRAINT at_least_one_of_ip_v4_or_ip_v6
      CHECK ((ip_v4 IS NOT NULL) OR (ip_v6 IS NOT NULL));
    

    Como alternativa, dê uma olhada na extensão RhodiumToad/ip4r . Se você usá-lo, poderá representar ip4, ip6ou ipaddress(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 inettipo de dados, que pode ser usado para armazenar endereços de internet (juntamente com máscaras de rede), a ip4rextensã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 usar ip ranges. Um caso de uso seria unir a coluna IP da log_loginstabela a outra tabela contendo intervalos de IP (arbitrários) e os países aos quais eles correspondem.

    • 18
  2. Evan Carroll
    2017-01-09T12:47:49+08:002017-01-09T12:47:49+08:00

    Sim. Isso é. Basta colocar uma restrição na tabela.

    CREATE TEMP TABLE foo (
      userid serial PRIMARY KEY,
      ipv4   inet   CHECK (family(ipv4) = 4),
      ipv6   inet   CHECK (family(ipv6) = 6),
      CHECK (ipv4 IS NOT NULL OR ipv6 IS NOT NULL)
    );
    

    Ou você pode usar apenas o mesmo tipo ( inet) que suportará ipv4 ou ipv6.

    CREATE TEMP TABLE foo (
      userid   serial PRIMARY KEY,
      userip   inet   NOT NULL 
    );
    
    • 8
  3. hellvisor
    2022-06-03T03:51:09+08:002022-06-03T03:51:09+08:00

    Esta é a minha solução para sequenciar o arquivo de migração na função "up"

    queryInterface.sequelize.getQueryInterface().addConstraint('log_logins', {
      fields: ['ipv4', 'ipv6'],
      type: 'check',
      name: 'ipv4_or_ipv6_is_null',
      where: { [Sequelize.Op.or]: [{ ipv4: null }, { ipv6: null }] },
    }),
    
    • -3

relate perguntas

  • Posso ativar o PITR depois que o banco de dados foi usado

  • Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo

  • Os procedimentos armazenados impedem a injeção de SQL?

  • Sequências Biológicas do UniProt no PostgreSQL

  • Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve