Fabiano vs Dúvidas…
Hoje foi o dia das perguntas na minha caixa de e-mail… 🙂
Portanto vamos as perguntas e respostas..
1. A primeira foi perguntando sobre como fazer com que o Resource Governor direcione um usuário de um Grupo no Active Directory para um especifico Pool de Recursos.
Bom, sabemos que o gerenciamento do Resource Governor é feito por uma function de classificação. É esta function irá dizer para o Resource Governor qual pool ele deve direcionar para determinado usuário que está fazendo login no servidor.
A pergunta aqui é: Como saber se o usuário esta fazendo login é de um determinado grupo do AD ou não?
Para este questionamento respondi o seguinte e-mail:
R.: Você pode criar a function de classificação utilizando a function IS_Member()… por ex:
CREATE FUNCTION dbo.Func_Classifica()
RETURNS SYSNAME
WITH SCHEMABINDING — SCHEMA BINDING IS REQUIRED
AS
BEGIN
DECLARE @Group NVarChar(400)
SELECT @Group = CASE
WHEN ISNULL(IS_MEMBER(‘DOMINIO\Grupo_Suporte’),0) = 1 THEN ‘GrupoSuporte’
WHEN ISNULL(IS_MEMBER(‘DOMINIO\Grupo_Analistas’),0) = 1 THEN ‘GrupoAnalistas’
WHEN ISNULL(IS_MEMBER(‘DOMINIO\Grupo_Desenvolvedores’),0) = 1 THEN ‘GrupoDesenvolvedores’
WHEN ISNULL(IS_MEMBER(‘DOMINIO\Grupo_Coordenadores’),0) = 1 THEN ‘GrupoCoordenadores’
ELSE ‘Default’
END
RETURN @Group
END
GO
2. A segunda pergunta que recebi foi me questionando se existe alguma Stored Procedure do SQL que retorne o nível de compatibilidade de um banco de dados.
R.: Temos a sp_dbcmptlevel que retorna o nível de compatibilidade de um determinado banco.
Obs.: Esta function será removida do SQL em versões futuras, por isso evite usa-la. Uma alternativa seria ler esta informação direto nas tabelas do sistema do SQL.
select * from master.sys.sysdatabases
A coluna cmptlevel contém o nível de compatibilidade do banco.
3. Outro questionamento que recebi foi o seguinte. Tenho uma procedure que executa vários comandos de updates, deletes, inserts e selects, tem de tudo. Estes comandos são executados várias vezes dentro de um loop.
Eu quero ver o plano de execução destes comandos em modo gráfico, mas quando eu rodo a procedure no SSMS com a opção de exibir o plano atual(ctrl+m) ligada, ele não consegue me exibir todos os planos, e chega uma hora que o SSMS trava.
R.: Uma alternativa para visualizar estes planos em modo gráfico, seria utilizar o Profiler. Basta ler o evento Performance\ShowPlan XML. Ele irá exibir no Profiler o plano em modo gráfico, por sinal, muito show isso!
4. Por último, me perguntaram sobre qual a melhor forma de apagar uma tabela de auditoria que é BEM, aproximadamente 20GB.
R.: Sem dúvida a melhor forma seria dar um TRUNCATE TABLE na tabela, mas o truncate tem alguns pontos que devem ser considerados.
- Caso exista alguma coluna Identity na tabela, o Truncate irá zerar o Identity.
- Não da para fazer rollback.
- Não conseguira utilizar qualquer filtro utilizando a clausula WHERE.
- A tabela não pode ter foreign key ou views indexadas.
- Será necessário ter privilégio de db_ddlAdmim para rodar o Truncate.
Dito isso, com mais detalhes sobre o que o desenvolvedor queria fazer descobri que seria necessário utilizar a clausula where para excluir apenas algumas linhas. Uma alternativa para não fazer com que o LOG fique muito grande seria ir apagando os registros de pouco em pouco. Esta operação pode demorar um pouco mais do que apenas um DELETE, mas dependendo do tamanho da tabela não nos restam muitas alternativas.
Por fim enviei o seguinte comando para ele:
SET NOCOUNT ON
WHILE EXISTS(SELECT 1 FROM Auditorias_TMP)
BEGIN
BEGIN TRAN
DELETE Auditorias_TMP
FROM Auditorias_TMP
WHERE <Algum Filtro>
TABLESAMPLE(10000 ROWS)
PRINT ‘Linhas apagadas – ‘ + CONVERT(VarChar, @@ROWCOUNT )
COMMIT TRAN
END
Espero que as respostas sejam úteis para vocês…
Abraços