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 / 195085
Accepted
World Wide DBA
World Wide DBA
Asked: 2018-01-11 08:56:13 +0800 CST2018-01-11 08:56:13 +0800 CST 2018-01-11 08:56:13 +0800 CST

Devo explicitamente DENY UPDATE para colunas que não devem ser atualizadas?

  • 772

Estou acostumado a trabalhar em ambientes muito seguros e, por isso, projeto minhas permissões com um grau muito fino de granularidade. Uma coisa que eu normalmente faço é explicitamente DENYusuários a capacidade de UPDATEcolunas que nunca devem ser atualizadas.

Por exemplo:

create table dbo.something (
    created_by varchar(50) not null,
    created_on datetimeoffset not null
);

Essas duas colunas nunca devem ser alteradas depois que o valor for definido. Portanto, eu explicitamente DENYa UPDATEpermissão sobre eles.

Recentemente, durante uma reunião de equipe, um desenvolvedor levantou a questão de que a lógica para garantir que os campos nunca sejam atualizados deve estar contida na camada de aplicativo e não na camada de banco de dados, caso "eles precisem atualizar os valores por algum motivo". Para mim, isso soa como a mentalidade típica de um desenvolvedor (eu sei, eu costumava ser um!)

Sou o arquiteto sênior da minha empresa e sempre trabalhei com o princípio da menor quantidade de privilégios necessários para que o aplicativo funcionasse. Todas as permissões são auditadas regularmente.

Qual é a melhor prática neste cenário?

sql-server database-design
  • 4 4 respostas
  • 3144 Views

4 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2018-01-11T09:02:29+08:002018-01-11T09:02:29+08:00

    O argumento não faz sentido. Eu sempre quero os controles e restrições o mais próximo possível dos dados. Colocá-lo na camada do aplicativo significa que ele afeta apenas as pessoas que usam a camada do aplicativo e também pressupõe que o código estará livre de bugs e a segurança em torno desses caminhos de código será à prova de balas. Essas são grandes suposições.

    Se eles absolutamente precisam ser atualizados, isso pode ser feito por uma pessoa não afetada pelo explícito DENY, ou a pessoa pode ser movida temporariamente para uma função que não é afetada, ou DENYpode ser removida temporariamente. Essas são coisas fáceis para você, como DBA, configurar a auditoria. No aplicativo? Não muito.

    • 30
  2. Solomon Rutzky
    2018-01-11T09:24:01+08:002018-01-11T09:24:01+08:00

    Eu concordo completamente com @Aaron no aspecto técnico disso.

    Além disso, eu diria, em relação às melhores práticas:

    1. Dado que é trabalho/responsabilidade do DBA proteger os dados, a abordagem padrão deve ser fazer exatamente isso, conforme o DBA achar adequado e exigir um caso de negócios sólido para fazer uma alteração. Um hipotético-futuro-potencial-um pouco-possível-dado-certas-condições-que-serão-pensadas-mais-tarde-e-confirmadas-bem-depois-de-isso-mas-talvez-mudou-mais-tarde-ou-talvez-nunca -o motivo que realmente aconteceu (ou seja, "por algum motivo") parece uma justificativa um pouco frágil, especialmente quando o tópico está mudando um padrão / prática da empresa.

    2. Nunca confie em alguém que quer fazer mudanças em algo que nunca deveria mudar ;-), (ainda mais se eles nem sabem porque querem).

    3. Diga ao desenvolvedor que ele pode adicionar essa lógica ao código do aplicativo para evitar essas atualizações. Mas, também que você não vai remover o arquivo DENY. Se / quando o dia chegar (epode nãoprovavelmente não) que alguém receba um erro ao tentar atualizar uma dessas colunas, então você poderá discutir se removerá ou não o DENY, o que exigirá uma justificativa real e sólida do motivo pelo qual alguém estaria atualizando esse valor no primeiro lugar.

      O ponto é: deve haver um caso de negócios real orientando o que as pessoas gastam seu tempo. O tempo está em alta demanda, mas é escasso, então você (e todos os outros) têm coisas mais importantes a fazer do que mudar o sistema com base na opinião de alguém. Sempre haverá uma variedade de opiniões (espaços vs guias, alguém?) e você pode passar anos mudando isso para frente e para trás se esse desenvolvedor sair e for substituído por alguém que se oponha fortemente a esses campos serem atualizáveis. Se nenhum cliente está solicitando isso (ou algo que exija), e não há benefício tangível (mesmo benefício atrasado, como quitação de dívida técnica, que é difícil de mostrar o ROI, mas vale muito a pena, pois o as chances de que o tempo gasto não resulte em economias de custos reais a longo prazo são quase nulas), em seguida, feche o pedido ou coloque-o no backlog em baixa prioridade, mesmo nos casos em que o idealismo diz que deve ser alterado (este não é um desses casos, mas mencionado para aqueles que pensam que é). Idealismo é ótimo para conversas, mas empresas não podem pagar aluguel, utilidades, funcionários, impostos, etc com ideais.

    4. @jpmc26 está correto sobre a necessidade de comunicação, mas não exatamente correto sobre o que precisa ser comunicado. Sim, você deve ouvir o que os outros estão solicitando e procurar entender o raciocínio deles, o que inclui fazer perguntas se você não tiver certeza sobre alguma coisa.

      NO ENTANTO, o banco de dados não é subserviente ao aplicativo, e os profissionais de banco de dados (administradores, engenheiros, qualquer que seja o nome que sua empresa use) não são subservientes aos desenvolvedores (como parece estar implícito nessa resposta). Você não trabalha para os desenvolvedores, você trabalha para a empresa, da mesma forma que eles. Este é um esforço de equipe e você não deve pedir perdão por fazer seu trabalho. Dito isto, nós, tipos de computador, não somos (geralmente) conhecidos por nossas habilidades de comunicação inter-humana, então, você realmente precisa ter certeza de que os outros o entendem , qual é o seu raciocínio, quais são suas responsabilidades e como essas coisas realmente funcionam .

      Eu coloquei essa última parte porque há um alto grau de mal-entendido, desinformação e falta de conhecimento por aí (até mesmo alguns aqui nesta página). Por exemplo, parece haver essa noção de que todas as regras são regras de negócios. Precisamos explicar que há uma distinção entre regras de dados e regras de negócios (@Aaron se referiu a isso como "restrição de fluxo de trabalho vs restrição de dados" em um comentário sobre a pergunta) e que, embora a maioria dos dados naturalmente pertença ao aplicativo, alguns dados realmente pertence ao modelo de dados. Um DBA deve ditar aos desenvolvedores como os dados do aplicativo serão restritos? Claro que não. É nosso trabalho oferecer como os dados do aplicativo podemser constrangido. Se uma violação de uma regra de negócios relacionada aos dados do aplicativo puder causar danos e o aplicativo não for 100% a única maneira de manipular os dados, talvez uma restrição de verificação possa realmente ajudar (e eles não são difíceis de alterar ou remover ).

      MAS, vindo de outra direção, os desenvolvedores não devem ditar como os dados do modelo de dados (ou seja, meta-dados) são tratados. Isso inclui campos de auditoria (como as colunas created_on/ created_by) e as colunas PK / FK (esses valores devem ser conhecidos apenas internamente e não fornecidos aos clientes). Esses dados não são o que o aplicativo armazena sobre os clientes (mesmo que o aplicativo possa ver os valores e até mesmo usá-los, como com IDs), é o que o modelo de dados armazena sobre os dados do aplicativo.

      Portanto, faz sentido usar regras de dados para proteger os dados do modelo de dados. E isso não significa que você está prestes a começar a adicionar restrições ou restrições aos dados do aplicativo. MAS, será difícil levar a conversa adiante de uma maneira verdadeiramente produtiva se essa distinção não for compreendida.

    Então:

    1. Sim, gosto da ideia do explícito DENYnas colunas de auditoria e propus o mesmo em lugares em que trabalhei no passado.
    2. Curiosamente, tive uma conversa muito semelhante com um desenvolvedor líder (muito bom), talvez em 2000, quando comecei a adicionar chaves estrangeiras. Ele argumentou (com bastante seriedade) que era um excesso de engenharia / idealismo desnecessário (algo assim, já se passaram 17 anos desde aquela conversa) e não valeu a pena o desempenho. Ele deixou bem claro que a limpeza de dados relacionados deve ser tratada na camada do aplicativo. (sim, eu adicionei os FKs porque ele não seria o único a limpar os dados órfãos que seu código inevitavelmente criaria)

      Anos depois, ele se desculpou por fazer esse argumento ;-)

    • 15
  3. jpmc26
    2018-01-11T19:41:28+08:002018-01-11T19:41:28+08:00

    Este é provavelmente um problema XY. O desenvolvedor provavelmente não está especialmente preocupado em bloquear atualizações para um campo verdadeiramente constante como created_on. Este exemplo em particular é uma restrição extremamente modesta.

    O desenvolvedor provavelmente está preocupado que a equipe de DBA (que inclui você) pretenda adicionar tantas ou tão complexas restrições que comece a impedir sua capacidade de trabalhar efetivamente, ou que quando algo fora do comum surgir ou algo mudar, a equipe de DBA vai resistir às mudanças e impedir a capacidade da equipe de desenvolvedores de progredir. Esta é uma preocupação relativamente razoável. As burocracias e a perda da capacidade de efetuar as mudanças necessárias são ocorrências reais, e a codificação de muitas restrições ou restrições complexas pode ter efeitos negativos no desempenho e na capacidade de responder às mudanças nos requisitos.

    O desenvolvedor pode nem perceber que essa é a natureza de suas preocupações. Eles provavelmente estão acostumados a ter domínio livre do banco de dados, e desistir desse nível de liberdade é difícil, especialmente se você sabe que nunca abusou dele. Portanto, seu senso de preocupação em perder a capacidade de fazer o que precisam pode ser vago e mal definido.

    Portanto, há algumas coisas que você deve fazer para aliviar esses medos:

    1. Comunique -se fortemente com os desenvolvedores. Certifique-se de entender as necessidades dos recursos que eles estão tentando criar e certifique-se de ser responsivo quando as alterações ocorrerem. Ouça o que eles têm a dizer e trabalhe duro para encontrar uma solução que equilibre as preocupações deles com as suas. Esteja disposto a ceder quando eles tiverem necessidades legítimas. Certifique-se de que eles saibam que você é um aliado na construção do software.
    2. Seja cauteloso ao colocar restrições. Restrições, mesmo aquelas destinadas a fornecer integridade e segurança, podem dificultar a adaptação à mudança ou lidar com circunstâncias imprevistas. Portanto, entenda que cada restrição que você adiciona tem tanto probabilidade de ter um custo associado quanto de economizar custos (com a possível exceção de chaves primárias e estrangeiras, que praticamente não têm desvantagens). Tenha certeza de que as restrições que você impõe são realmente necessárias ou benéficas.
    3. Não vejo nenhum sinal de que você esteja fazendo isso, mas quero mencioná-lo para qualquer outro leitor: não veja os dados ou o banco de dados como responsabilidade sua ou de sua equipe. Os dados são um ativo para toda a empresa. Sem um sistema para armazená-lo (o banco de dados) e scripts, ferramentas ou aplicativos para criá-lo, atualizá-lo e buscá-lo, os dados são inúteis. Como todos devem usar esse ativo, os dados são de responsabilidade de todos. O próprio banco de dados é apenas uma parte da obtenção de valor dos dados.
    • 8
  4. paparazzo
    2018-01-11T10:48:39+08:002018-01-11T10:48:39+08:00

    Você tem declarações conflitantes

    • Colunas que nunca devem ser atualizadas
    • Eles precisam atualizar os valores por algum motivo

    Cabe realmente a você ditar o primeiro?

    Você joga no mínimo privilégio para fazer o aplicativo funcionar sem prova de que o aplicativo nunca precisará atualizar o valor.

    Quem é responsável pela integridade dos dados?

    Com restrições SQL você pode garantir a integridade dos dados? Não, você não pode, pois muitas vezes existem regras de negócios que vão além do que um banco de dados pode fazer.

    VendorID nunca deve mudar, mas e se dois fornecedores se fundirem. Nunca diga nunca.

    Se a equipe do aplicativo contaminar os dados e eles disseram que precisavam dessa autoridade, ela está com eles. Se as equipes de aplicativos funcionarem para você, você poderá ditar.

    A pergunta apropriada é se o aplicativo atualizar os dados.

    • 0

relate perguntas

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

  • Como determinar se um Índice é necessário ou necessário

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