Violação de chave estrangeira

Bem gente o problema agora é o seguinte.
Tenho duas tabelas uma de clientes e outra chamada vendas. Como o proprio nome já sugere a tabela de vendas regristra as vendas feitas pelo sistema, nela são gravados dados como a data da venda, valor, hora, funcionario que vendeu e também o cliente que comprou. Para gravar o cliente é feito um relacionamento da tabela de vendas com a tabela de clientes sendo usado então apenas o código do referido cliente.
Agora vem a questão. Como poder apagar o cliente sem violar a chave estrangeira? Sei que dá pra setar a integridade com Delete em Cascata, mas isso prejudicaria a tabela de vendas que registra as vendas realizadas.
A tabela de vendas será usada para impressão de relatórios e se usar Delete em Cascata as vendas feitas para aquele cliente tb serão deletadas o que não pode acontecer, ou seja, o cliente pode ser excluido mas a movimentação dele na loja não pode.

Alguém pode me dar uma luz?

Bom, se você quer manter os registros das vendas não deve deixar que os registros de clientes que possuam vendas registradas sejam excluídos, pois isto violaria as regras de integridade referencial do seu banco de dados e possivelmente causaria erros de execução em seu aplicativo.

Júlio,

Este problema não é somente questão de erro de integridade na base. Se seu sistema permitir que isso ocorra vc está prejudicando a consistência de seu sistema. Isso é uma questão de definição da regra de negócio, e não vejo isso com bons olhos.

Se vc colocar a chave do cliente em vendas como uma chave estrangeira, vc não conseguirá remover o cliente sem remover suas vendas respectivas. Isso é fato!

A menos que vc especifique como NÃO sendo chave estrangeira e controle a integridade via código, a base permitirá a remoção do cliente sem as suas respectivas vendas. Mas aí eu te pergunto, como vc vai saber no relatório de vendas quem comprou o que? Senão tem a informação do cliente!

Outra possibilidade é vc não fazer o relacionamento entre Vendas e Cliente. E usar sua base desnormalizada, gravando assim os dados do cliente na tabela de vendas. Desta forma vc poderá remover o cliente sem remover as vendas e também não perderá as informações sobre quem comprou o que. Já vi vários sistemas utilizando tabelas desnormalizadas com objetivo de melhorar performance e outros.

@braços

Olá matheusssilva, crie um campo na tabela de cliente que indique se o mesmo esta ativo ou não, desse modo quando precisasse excluí-lo você apenas iria alterar o valor dessa coluna, mantendo assim suas regras de integridade intactas, nas consultas que buscam usuários válidos você colocaria nessa esse novo campo, por exemplo:

novo campo= flg_ativo CHAR(1) [S- ATIVO N-INATIVO]

SELECT *
FROM CLIENTES
WHERE FLG_ATIVO <> ‘N’;