Arquivo

Archive for the ‘SQL Server’ Category

SQL Server: Application Role

22/10/2008 1 comentário

Uma funcionalidade muito interessante foi adicionada ao SQL Server 2005 e mantida, obviamente, no SQL Server 2008. Para facilitar o gerenciamento das permissões no banco de dados utilizamos um recurso chamado ROLE. Um database ROLE é um objeto criado no banco de dados no qual é possível dar ou negar permissões de acesso dos outros objetos.

Vamos a um exemplo: você tem um perfil de usuários na empresa que só pode manipular informações referentes ao sistema de Recursos Humanos. Para facilitar o gerenciamento das permissões você cria uma ROLE chamada RL_RH e define todas as permissões de acesso a ela.

CREATE ROLE RL_RH AUTHORIZATION dbo; –CRIA A ROLE

GRANT SELECT TO RL_RH; –PERMITE SELECT EM TODOS OS OBJETOS

Imagine que um novo usuário deve ser adicionado ao banco de dados e precisa ter os mesmos acessos de todos os outros do RH. Para isso basta criar o usuário e adicioná-lo ao papel já criado. Por exemplo:

CREATE LOGIN US1 WITH PASSWORD=’p@ssw0rd’; –CRIA O LOGIN NO SERVIDOR

CREATE USER US1 FOR LOGIN US1; –CRIA UM USUÁRIO PARA O LOGIN NO BANCO DE DADOS

SP_ADDROLEMEMBER ‘RL_RH’, ‘US1’; –ADICIONA O USUÁRIO COMO MEMBRO DA ROLE

Com isso, o usuário passa a ter todos os direitos da role!

Legal, não é? Mas agora imaginemos que temos alguns usuários mais avançados capazes de criar comandos SQL e executá-los diretamente no banco de dados. Coisa que não deveriam fazer a não ser através de um sistema. Como evitar que isso ocorra? Como saber se o usuário está se conectando através de uma ferramenta tipo o SSMS ou através de um sistema. Para isso, existe um recurso chamado de Application Role!

O funcionamento é semelhante, cria-se um APPLICATION ROLE e se define todas as permissões a ele. Por exemplo:

CREATE APPLICATION ROLE RL_APP_RH WITH PASSWORD = ‘pa$$w0rd’; –CRIA UM APPLICATION ROLE COM SENHA

GRANT SELECT TO RL_APP_RH; –PERMITE SELECT EM TODOS OS OBJETOS

Para os usuários:

CREATE LOGIN US2 WITH PASSWORD=’xpt0′;

CREATE USER US2 FOR LOGIN US2;

No sistema, logo após abrir a conexão com o banco de dados execute:

SP_SETAPPROLE ‘RL_APP_RH’, ‘pa$$w0rd’; –ATIVA O USO DA ROLE MEDIANTE INFORMAR O PASSWORD

Pronto a partir de agora a ROLE está ativada digamos assim. Houve uma troca no contexto de segurança e o usuário passa a ter acesso a tudo que havia sido definido para a ROLE. Se ele conectar-se diretamente no banco de dados não terá acesso a nada.


SQL Server – Rollback Transaction em Triggers

O que acontece se executar o comando ROLLBACK TRANSACTION em uma Trigger no SQL Server? A primeira coisa que passa na cabeça é: o que foi iniciado na transação será desfeito! Sim, isso está correto. Mas se pensarmos um pouco mais além: e se após este comando houver outros comandos, eles serão executados? E se estes comandos causarem o disparo de outra trigger, ela será disparada? E os outros comandos que que estão no batch após o comando que originou o disparo da trigger, serão executados?

O comportamento é seguinte:

  • As alterações feitas até a execução do ROLLBACK TRANSACTION são desfeitas;
  • A trigger continua a execução com os demais comandos que houverem após o ROLLBACK, mas nenhuma outra trigger será disparada;
  • Os demais comandos que houverem no batch também não serão executados.

Ou seja, imaginemos o seguinte cenário: em uma trigger é implementada uma regra de negócio. Regra esta que em determinada condição precisa interromper a transação. Mas você gostaria de gravar um trace da execução dessa trigger. Ok! Após o ROLLBACK TRANSACTION é possível executar um comando INSERT para inserir o trace em outra tabela!

Se quiserem saber mais sobre o comando ROLLBACK TRANSACTION acessem o MSDN!

Abraços!

Categorias:SQL Server Tags:,