Archive

Archive for the ‘Comandos SQL’ Category

ApexSQL Refactor

Deletando informações em batches –

Freccia's Blog

Olá pessoal,

Quando trabalhamos bases de dados muito grandes e criticas é normal que alguma forma de purge (expurgo) seja feita no banco de dados, é melhor para a aplicação e também para o DBA. Porem uma grande preocupação quando vamos falar sobre deletar uma grande quantidade de dados é não prejudicar nosso arquivo Transaction Log para que o mesmo não estoure o espaço em disco, como também não bloqueie nossa aplicação que esta tentando inserir ou atualizar dados na base. Alem de tudo isso nos preocupamos com performance, pois uma grande operação de delete poderia impactar todo o nosso ambiente.

Pensando nisso criei um script bem simples, mas que pode te ajudar no momento de realizar esse expurgo da base de dados.

Ver o post original 627 mais palavras

Categorias:Comandos SQL, DBA Tags:

Comandos DBCC

Inside DBA's Life

Olá,

O SQL Server possui uma série de comandos chamados DBCC (Database Console Commands). Mais informações aqui (http://technet.microsoft.com/pt-br/library/ms188796.aspx)

Estes comandos são divididos em quatro categorias:

  • Manutenção (Maintenance)
  • Diversos (Miscellaneous)
  • Informação (Informational)
  • Validação (Validation)

Existem 30 comandos documentados. (Vide link da documentação oficial acima). Porém, existem muitos outros comandos DBCC não-documentados. (e obviamente não suportados).

Para poder visualizar todos os comandos DBCC é preciso habilitar um trace flag. Até o SQL Server 2005 você poderia utilizar o trace flag 2520 mas depois desta edição passou a valer o trace flag 2588, conforme explicado pelo Paul Randal (autor da alteração) neste post (https://www.sqlskills.com/blogs/paul/dbcc-writepage/).

Há um dos comandos DBCC que lista todos os outros: DBCC HELP. Nele você pode informar o nome do comando DBCC que você deseja visualizar, onde será informado os parâmetros utilizados pelo comando, ou informar o parâmetro ‘?’, para listar todos os comandos.

Para visualizar…

Ver o post original 458 mais palavras

(TSQL) VALIDAR CPF

— Para testar depois de executar a função: 
SELECT dbo.Fun_ValidarCPF(‘29498505390’)

— Criando a função que Valida CPF

CREATE FUNCTION Fun_ValidarCPF(@CPF VARCHAR(11))
RETURNS CHAR(1)
AS
BEGIN
DECLARE @INDICE INT,
                    @SOMA INT,
                    @DIG1 INT,
                    @DIG2 INT,
                    @CPF_TEMP VARCHAR(11),
                    @DIGITOS_IGUAIS CHAR(1),
                    @RESULTADO CHAR(1)

SET @RESULTADO = ‘N’

/* Verificando se os dígitos são iguais 
A Principio CPF com todos o números iguais são Inválidos apesar de validar o Calculo do digito verificado
EX: O CPF 00000000000 é inválido, mas pelo calculo Validaria */

SET @CPF_TEMP = SUBSTRING(@CPF,1,1)

SET @INDICE = 1
SET @DIGITOS_IGUAIS = ‘S’

WHILE (@INDICE <= 11)
BEGIN
   IF SUBSTRING(@CPF,@INDICE,1) <> @CPF_TEMP
      SET @DIGITOS_IGUAIS = ‘N’
      SET @INDICE = @INDICE + 1
   END;

–Caso os digitos não sejão todos iguais Começo o calculo do dígitos
IF @DIGITOS_IGUAIS = ‘N’
BEGIN
   –Cálculo do 1º dígito
   SET @SOMA = 0  
   SET @INDICE = 1

   WHILE (@INDICE <= 9)
   BEGIN
      SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CPF,@INDICE,1)) * (11 – @INDICE);
      SET @INDICE = @INDICE + 1
   END

   SET @DIG1 = 11 – (@SOMA % 11)

   IF @DIG1 > 9
      SET @DIG1 = 0;

   — Cálculo do 2º dígito }
   SET @SOMA = 0
   SET @INDICE = 1

   WHILE (@INDICE <= 10)
   BEGIN
      SET @Soma = @Soma + CONVERT(INT,SUBSTRING(@CPF,@INDICE,1)) * (12 – @INDICE);
      SET @INDICE = @INDICE + 1
   END

   SET @DIG2 = 11 – (@SOMA % 11)

   IF @DIG2 > 9
      SET @DIG2 = 0;

— Validando
   IF (@DIG1 = SUBSTRING(@CPF,LEN(@CPF)-1,1)) AND (@DIG2 = SUBSTRING(@CPF,LEN(@CPF),1))
      SET @RESULTADO = ‘S’
   ELSE
      SET @RESULTADO = ‘N’
   END

   RETURN @RESULTADO
END

 

Vejam tb:
DÍGITOS VERIFICADORES

Como validar CPF e CNPJ no SQL Server

— Adaptado por: Alex Souza

Top 10 da Semana passada!!!

Acessando informações em outro Banco de Dados sem o usuário ter acesso as tabelas deste outro Banco de Dados (SQL Server)

/*
Situação  : Tenho 2 Bancos de Dados de 2 Sistemas distintos (2 Fornecedores de Solução)

   Problema  : Um dos bancos de dados (BD do Fornecedor B) precisam acessar determinados dados no outro banco de dados (BD do Fornecedor A).
   Solução   : Criamos uma Stored Procedure no BD do Fornecedor B pegando dados que necessitam no BD do Fornecedor A
   Observação: O usuário/login do Fornecedor B não tem acesso ao Banco de Dados do Fornecedor A
   
   Como podemos fazer isso?
*/

/***********************
 * Montagem do Cenário *
 ***********************/
——————————————————-
— Criando o Banco de dados Fornecedor A —
——————————————————-
CREATE DATABASE DA;
USE DA;
— Criando tabela de exemplo
CREATE TABLE TA (id int, nm varchar(15))

— Inserindo algumas coisas
INSERT INTO TA VALUES (1, ‘AAAA’), (2, ‘BBBB’)

— Selecionando as informações
SELECT * FROM TA

——————————————-
— Criando o Login / Usuário (LB) —
——————————————-
— O Usuário LA é Dono (db_owner) do Banco DA e SYSADMIN
USE [master]
GO
CREATE LOGIN [LA] WITH PASSWORD=N”, DEFAULT_DATABASE=[DB], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
EXEC master..sp_addsrvrolemember @loginame = N’LA’, @rolename = N’sysadmin’
GO
USE [DA]
GO
CREATE USER [LA] FOR LOGIN [LA]
GO
USE [DA]
GO
EXEC sp_addrolemember N’db_owner’, N’LA’
GO

———————————————
— Banco de dados do fornecedor B —
———————————————
CREATE DATABASE DB;
USE DB;

— Criando tabela de exemplo
CREATE TABLE TB (id int, nm varchar(15))

— Inserindo algumas coisas
INSERT INTO TB VALUES (1, ‘CCCC’), (2, ‘DDDD’)

— Selecionando as informações
SELECT * FROM TB

——————————————-
— Criando o Login / Usuário (LB) —
——————————————-
— O Usuário LB é Dono (db-owner) do Banco DB
USE [master]
GO
CREATE LOGIN [LB] WITH PASSWORD=N”, DEFAULT_DATABASE=[DB], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
GO
USE [DB]
GO
CREATE USER [LB] FOR LOGIN [LB]
GO
USE [DB]
GO
EXEC sp_addrolemember N’db_owner’, N’LB’
GO

— *-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
— Criaremos uma Stored Procudure no Banco de Dados do Fornecedor B (DB) para acessar dados do Banco de Dados do Fornecedor A (DA)
— Só lembrando que o usuário do Fornecedor B (LB) não tem acesso ao Banco de Dados do Fornecedor A (DA)
— *-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-**-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

USE [DB]
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[sp_frnA]
AS
BEGIN
SELECT * FROM DA.dbo.[TA]
END

— Observação: Onde TA – Tabela do Banco de Dados do Fornecedor A

— ###########################
— # FAZER LOGIN COM O USUÁRIO LB #
— ##########################

— Vamos fazer o login com LB (só lembrando: O Usuário LB é Dono (db-owner) do Banco DB e não tem acesso ao DA)
— Onde DB – Banco de Dados do Fornecedor B
— Onde DA – Banco de Dados do Fornecedor A

— LB = Login do usuário do Banco de Dados: DB (este login não tem acesso ao DA)
— LA = Login do usuário do Banco de Dados: DA

— Agora vamos tentar executar a procedure sp_frnA
exec sp_frnA

— Irá aparecer a mensagem:
Msg 916, Level 14, State 1, Procedure sp_frnA, Line 4
The server principal “LB” is not able to access the database “DA” under the current security context.

— Basicamente dizendo que o LB (login do fornecedor B) não tem acesso ao DA (Banco de dados do Fornecedor A)

— Vamos alterar a procedure para executar com o Login: LA (por dentro da propria procedure):
— ###############################
— # FAZER LOGIN COM O USUÁRIO LA #
— ###############################

ALTER PROCEDURE [dbo].[sp_frnA]
AS
BEGIN
EXECUTE AS LOGIN = ‘LA’;

SELECT * FROM DA.dbo.[TA]
END

— ###############################
— # FAZER LOGIN COM O USUÁRIO LB #
— ###############################

— Vamos executar agora:
exec sp_frnA

— Apresentou:
Msg 15406, Level 16, State 1, Procedure sp_frnA, Line 4
Cannot execute as the server principal because the principal “LA” does not exist, this type of principal cannot be impersonated, or you do not have permission.

— Vamos fazer a seguinte alteração para que o usuário LB representasse o LA
— Cuidado com este tipo de acesso, mas é uma solução dependendo do caso!
— ###############################
— # FAZER LOGIN COM O USUÁRIO LA #
— ###############################

USE master
GRANT IMPERSONATE ON LOGIN:: LA TO LB;

— ###############################
— # FAZER LOGIN COM O USUÁRIO LB #
— ###############################

— Vamos executar novamente:
exec sp_frnA

— Apareceu!!!
— Espero ter ajudado, mas usem com moderação!

Maiores informações de IMPERSONATE

“Array” no SQL Server

L&A Soluções – Consultoria em Banco de Dados SQL Server ( Suas informações em boas mãos! )

Ola galera, segue uma pequena dica de manipulação de resultados (“Array”) no SQL Server, abaixo mostrarei como surgiu a necessidade…

Tive essa semana a seguinte conversa com o grande amigo (Dentinho)

(Dentinho) Como faço um Array no SQL Server?

(Alex Souza) Cara, este comando especificamente não existe, mas tem jeito de fazer algo parecido

(Dentinho) No POSTGRES faço muito rápido com o comando ARRAY.

(Alex Souza) Me diga ai o que você esta precisando…

(Dentinho) Tenho uma Consulta que retorna as seguintes informações:

1

(Dentinho) Eu consigo trazer estes dados em uma unica linha separado por virgula? Desde ontem tento e não consigo…

(Dentinho) Exemplo: 123, 124, 125…

(Alex Souza) Quanto tempo você me dá para arrumar uma solução?

(Dentinho) 4 minutos

(Alex Souza) Certo, dá tempo até tomar um café antes… kkkk

… 4 minutos depois…

(Alex Souza) Pronto, a solução esta dada, vamos montar uma função (FuArrayNFTitulo) que retornará o seguinte:

2

… Segue abaixo a montagem do cenário e a função:  [FuArrayNFTitulo]

———————————
— Montagem do Cenário —
———————————

— Criando o Banco de Dados
CREATE DATABASE TestesBlog;

USE TestesBlog

— Criando a tabela
CREATE TABLE NF_Titulos (
NumNF int
, NumTitulo int
);

— Cada NF pode ter vários títulos (Populando…)
INSERT INTO NF_Titulos VALUES (111, 123) , (111, 124), (111, 125), (111, 126), (112, 127), (112, 128)

— Consulta que retorna os títulos em linhas (o problema do Dentinho…)
Select NumTitulo From NF_Titulos WHERE NumNF = 111

— Montamos a seguinte função: FuArrayNFTitulo que tem como entrada a NF e retorna os Títulos relacionados a esta NF
CREATE FUNCTION [dbo].[FuArrayNFTitulo] (@NumTit INT) 
RETURNS VARCHAR(MAX)
AS

BEGIN

DECLARE @Hist VARCHAR(MAX)
SET @Hist = ”

SELECT @Hist = @Hist + CASE WHEN @Hist = ” THEN ” ELSE ‘, ‘ END + Convert(varchar, NumTitulo)
FROM NF_Titulos
WHERE NumNF = @NumTit

RETURN @Hist

END

———————————————-
relogio-um-escravo-do-tempo

— Resultado da função (SOLUÇÃO) —
———————————————-

SELECT Resp = dbo.[FuArrayNFTitulo] (111)
Abraço a todos!
Valeu Dentinho…


Vejam também:

Matrizes no SQL Server 2005 ( Parte I | Parte II | Parte III )

Alex Souza
L&AConsultoria - Logo

%d blogueiros gostam disto: