Alterando registros em SQL

outubro 25, 2007

Vou iniciar este post escrevendo sobre como alterar registros em tabelas utilizando SQL. A sintaxe é simples:

UPDATE

[NOME_TABELA]

SET

[NOME_CAMPO] = [EXPRESSÃO][…n]

WHERE
{

[CONDICAO_SQL]

}

Como podem ver, inicia-se com a palavra-chave UPDATE, em seguida insere o nome da tabela desejada para ser alterada, logo após a palavra chave SET e o nome do(s) campo(s) à ser(em) alterado(s) e uma possível condição, caso necessite atualizar registros específicos.

UPDATE

Livros

SET

Nome = ‘The Art of War’

WHERE

LivroID = 5

Pode-se utilizar a instrução UPDATE unindo informações de diversas tabelas, caso precise comparar um valor que a tabela que deseja alterar não possua.

UPDATE

Livros

SET

L.Nome = ‘The Art of War’

FROM

Livros L,

Autores A

WHERE

L.AutorID = A.AutorID

AND

A.Nascimento BETWEEN ‘1950-01-01 00:00:00.000’ AND ‘1970-01-01 23:59:59.999’

A instrução SQL acima irá alterar todos os registros do campo ‘Nome’ da tabela ‘Livros’ cujo o autor coincidir com o do livro e a data de nascimento (Nascimento) do autor estiver entre 1950 e 1970.

Também pode utilizar funções no campo que deseja alterar.

UPDATE

Livros

SET

Valor = CAST(RAND() * 150 AS MONEY)

WHERE

ID > 10

Acima será alterados todos os livros que o ‘ID’ (chave primária) for maior que 10. A função RAND retorna um número aleatório entre 0 e o número especificado (no nosso caso 100) e após isso é feito uma conversão para o tipo MONEY, que indica que é moeda.

Existe outra maneira de atualizar um registro de uma tabela unindo informações de uma outra tabela. Isto pode ser feito utilizando o operador JOIN, que serve para juntar informações de tabelas que possuem registros diferentes, porém que tenham campo(s) relacionados entre si.

UPDATE

Livros

SET

Livros.Publicacao = Autores.Nascimento

FROM

Livros

INNER JOIN

Autores ON

(Autores.AutorID = Livros.AutorID)

E por último, pode alterar diversos campos de uma só vez utilizando o UPDATE.

UPDATE

Livros

SET

Nome = ‘O Alquimista’,

Publicacao = ‘1988-01-01’,

AutorID = 75

WHERE

LivroID = 23

Está ai a atualização de 3 campos de uma só vez…

Que a linguagem SQL tem muitas utilidades e facilidades já sabemos e hoje andei pesquisando algo sobre permitir ou negar um tipo de consulta (INSERT, UPDATE, DELETE e SELECT) de uma determinada tabela à um determinado usuário. Isso pode ajudar a controlar a segurança da informação, caso não queira que um determinado usuário visualize as informações por exemplo de um cliente.

Vamos a prática:

DENY

SELECT

ON

Fornecedor

TO

[alexandre.araujo]

A instrução acima nega a permissão do usuário Alexandre de listar informações da tabela ‘Fornecedor’. Esta instrução pode ser aplicada em usuários em geral, inclusive de uma rede. Veja a instrução abaixo:

DENY

SELECT

ON

Fornecedor

TO

[ORGANIZACAO\alexandre.araujo]

Foi colocado o nome da rede barra invertida (\) e depois o usuário que não pode acessar as informações. Este exemplo pode incluir instruções em geral.

DENY

SELECT,

INSERT,

UPDATE

ON

Fornecedor

TO

[ORGANIZACAO\alexandre.araujo]

Pronto, o usuário acima apenas poderá exclui registro da tabela ‘Fornecedor’. Agora vocês devem estar perguntando: Como faço para voltar ao normal? Simples, substitua a instrução DENY por GRANT. Veja o exemplo abaixo:

GRANT

SELECT,

INSERT,

UPDATE

ON

Fornecedor

TO

[ORGANIZACAO\alexandre.araujo]

Agora sabemos como negar e autorizar o acesso de uma tabela.

Encontrei uma maneira muito útil de saber se uma determinada instrução SQL de alteração (UPDATE) atualizou o registro de uma tabela.

Observe a instrução abaixo de atualização:

UPDATE

Cliente

SET

Nome = ‘Alexandre’

WHERE

ID = 89712

A instrução acima é simples, porém se está instrução for feita em uma PROCEDURE SQL ou qualquer outro tipo de execução, como por exemplo: TRIGGER, não se saberá se o registro foi atualizado com sucesso. Para se obter esta informação é preciso adicionar a seqüência abaixo:

IF @@ROWCOUNT = 0

A pequena instrução acima verifica se a quantidade de linhas (registros) alterados é igual à 0. Com isto é possível saber se o registro foi atualizado e fazer um tratamento específico para a situação.