Mostrando postagens com marcador MSSQL. Mostrar todas as postagens
Mostrando postagens com marcador MSSQL. Mostrar todas as postagens

domingo, 24 de outubro de 2021

Creating user to acess SQL databases on Azure

 

Open Azure Data Studio and execute these commands:

-- create login credentials on the server
USE master;
CREATE LOGIN user_name WITH password='p455w0rd';
GO

-- create user on the database
USE DATABASE_NAME;
CREATE USER user_name FROM LOGIN user_name;
GO

-- grant permission for user
USE DATABASE_NAME;
EXEC sp_addrolemember 'db_datareader''user_name';
EXEC sp_addrolemember 'db_datawriter''user_name';
EXEC sp_addrolemember 'db_backupoperator''user_name';
GO

sábado, 7 de agosto de 2021

SQL Backup Docker container

Create account in https://sqlbak.com/ and copy the key (You will need after)


Download sqlBak:

Run: docker run --name sqlbak_container -d -v sqlbak_volume:/opt/sqlbak pranasnet/sqlbak


Run the container with your key

Run: docker exec sqlbak_container sqlbak --register --key=YOUR_KEY_HERE -n sqlbak


Now you need to add a connection to DBMS (MySQL, PostgreSQL, MSSQL Server). 

Run: docker exec 9d8a0302a4a3 sqlbak -ac -dt <dbms_type> -h <host> -u <user_name> -p <password>



terça-feira, 3 de agosto de 2021

SQL Server on Docker Container

After instal Docker run following commands (depends on your main OS, maybe you need add "sudo" on begin for each command): 


// install SQL Server

docker pull mcr.microsoft.com/mssql/server:2017-latest


// run container

docker run --name sqlserver --hostname sqlserver -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourPasswordHere" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest 


// run container with autorun on restart (add --restart always)

docker run -- restart always --name sqlserver --hostname sqlserver -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=YourPasswordHere" -p 1433:1433 -d mcr.microsoft.com/mssql/server:2017-latest 


// list services

docker ps -a


// open bash terminal inside into container

docker exec -it sqlserver "bash"


// run sqlcmd tool

/opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P "YourPasswordHere"


// stop container

docker stop sqlserver


// remove 

docker rm sqlserver


domingo, 7 de agosto de 2016

SQL Server Azure - Query retornando data e hora ajustada com o fuso horário

Para quem está usando SQL Server Azure (funciona também com instância local), segue dica de um query que retorna o horário ajustado de acordo com a timezone informada no formato float.

No exemplo ultilizaremos a timezone -3:

declare @HorDif float = -3
select DATEADD(HH, @HorDif, GETUTCDATE ()) as Resultado




SQL Server - Controlar ID de autoincremento (Alternativa ao autoinc do SQL)

Se você precisa controlar suas IDs (identidade, identity, autoinc), segue uma dica de como fazer isso sem dar locks em tabelas, o que seria um grande problema de desempenho.

1 - Crie a tabela que armazenará os últimos IDs usados:

CREATE TABLE [dbo].[IDs]
(
    IDNom nvarchar(255) NOT NULL,
    IDUlt int NULL,
    CONSTRAINT [PK_tblIDs] PRIMARY KEY CLUSTERED
    (
        [IDNom] ASC
    ) WITH
    (
        PAD_INDEX = OFF
        , STATISTICS_NORECOMPUTE = OFF
        , IGNORE_DUP_KEY = OFF
        , ALLOW_ROW_LOCKS = ON
        , ALLOW_PAGE_LOCKS = ON
        , FILLFACTOR = 100
    )
);
GO

2 Crie a StoredProcedure que vai retornar o novo ID a cada solicitação e registrar seu uso na tabela anterior (SP criada por Max Vernon e Mike Defehr e fiz algumas alterações):

CREATE PROCEDURE [dbo].[ProxID](
    @IDName nvarchar(255)
)
AS
BEGIN

    DECLARE @Retry int;
    DECLARE @EN int, @ES int, @ET int;
    SET @Retry = 5;
    DECLARE @NewID int;
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    SET NOCOUNT ON;
    WHILE @Retry > 0
    BEGIN
        BEGIN TRY
            UPDATE dbo.IDs
            SET @NewID = IDUlt = IDUlt + 1
            WHERE IDNom = @IDName;

            IF @NewID IS NULL
            BEGIN
                SET @NewID = 1;
                INSERT INTO IDs (IDNom, IDUlt) VALUES (@IDName, @NewID);
            END
            SET @Retry = -2; /* no need to retry since the operation completed */
        END TRY
        BEGIN CATCH
            IF (ERROR_NUMBER() = 1205) /* DEADLOCK */
                SET @Retry = @Retry - 1;
            ELSE
                BEGIN
                SET @Retry = -1;
                SET @EN = ERROR_NUMBER();
                SET @ES = ERROR_SEVERITY();
                SET @ET = ERROR_STATE()
                RAISERROR (@EN,@ES,@ET);
                END
        END CATCH
    END
    IF @Retry = 0 /* must have deadlock'd 5 times. */
    BEGIN
        SET @EN = 1205;
        SET @ES = 13;
        SET @ET = 1
        RAISERROR (@EN,@ES,@ET);
    END
    ELSE
        SELECT @NewID AS NovoID;
END
GO

Pronto!

Agora é só usar a SP passando como parâmetro um nome qualquer (no meu caso uso o nome da tabela).
Se não existir, a SP cria automaticamente e retorna o valor 1.
Se já existir ela retorna o novo valor na sequencia.

Exemplo:

sexta-feira, 22 de abril de 2016

SQL Server - Comparar dois bancos e listar diferenças

Para quem tem dificuldades em manter atualizadas as estruturas de seus clientes, vou postar uma query que compara dois Bancos de Dados. Vejam a query e observem os comentários:

-- BANCO A
use Quantum
SELECT CONCAT(t.name, '.', c.name, ' (', tp.name, ', ', c.length, ', ', c.isnullable, ')') TabelaCampoTipoTamanhoNull, t.name Tabela, c.name Campo, tp.name Tipo, c.length Tamanho, c.isnullable PerniteNull 
into #EstruturaA
FROM SYSCOLUMNS c
inner join SYSOBJECTS t on t.id = c.id
inner join SYSTYPES tp on tp.xtype = c.xtype
where t.xtype = 'U'
go

-- BANCO B
use QuantumNovo
SELECT CONCAT(t.name, '.', c.name, ' (', tp.name, ', ', c.length, ', ', c.isnullable, ')') TabelaCampoTipoTamanhoNull, t.name Tabela, c.name Campo, tp.name Tipo, c.length Tamanho, c.isnullable PerniteNull
into #EstruturaB
FROM SYSCOLUMNS c
inner join SYSOBJECTS t on t.id = c.id
inner join SYSTYPES tp on tp.xtype = c.xtype
where t.xtype = 'U'
go

-- Lista as Tabelas e Campos que só existem no A, e logicamente não existem no B 
SELECT TabelaCampoTipoTamanhoNull ExisteSomenteNoBancoB, Tabela, Campo, Tipo, Tamanho, PerniteNull
FROM #EstruturaB
where TabelaCampoTipoTamanhoNull
not in (SELECT TabelaCampoTipoTamanhoNull
FROM #EstruturaA)

-- Lista as Tabelas e Campos que só existem no B, e logicamente não existem no A 
SELECT TabelaCampoTipoTamanhoNull ExisteSomenteNoBancoA, Tabela, Campo, Tipo, Tamanho, PerniteNull
FROM #EstruturaA
where TabelaCampoTipoTamanhoNull
not in (SELECT TabelaCampoTipoTamanhoNull
FROM #EstruturaB)

SQL Server 2012 e 2014 - Pulando (saltando) sequencia de autoincremento (identity)


A partir do SQL Server 2012 notei existe um bug na sequencia de autoincremrnto dos campos IDENTITY. Notei isso em 25/03/2012, ou seja, logo que lançaram o 2012. Postei no MSDN a questão e mesmo a confirmação do bug por parte de usuários experientes e certificados, pediram pra aguardar que muito possivelmente viria uma correção (ver post).

Mas veio o 2012 SP1 e o 2014 e o problema continua. Exemplo de um caso já no MSSQL 2014, onde o identity salta do 9 para o 1009:

Com o intuito de ajudar os que passam pelo mesmo problema e ainda aguardam uma solução por parte da Microsoft, vou postar uma solução paliativa (gambiarra) para evitar que o salto aconteça.

Basta executar a query abaixo e não haverá mais saltos do identity em todo o servidor (todos os bancos e tabelas, mesmo os criados depois).

Caso prefira troque o nome da Stored Procedure de sp_FixSeeds2012 para sp_FixSeeds[e o numero da sua versao], mas não interfere no funcionamento. Portanto aconselho não perder tempo com isso.

USE master; 
GO
CREATE PROCEDURE sp_FixSeeds2012
AS
BEGIN

    --foreach database
    DECLARE @DatabaseName varchar(255)
    
    DECLARE DatabasesCursor CURSOR READ_ONLY
    FOR
        SELECT name
        FROM sys.databases
        where name not in ('master','tempdb','model','msdb') and sys.databases.state_desc = 'online'

    OPEN DatabasesCursor

    FETCH NEXT FROM DatabasesCursor
    INTO @DatabaseName

    WHILE @@FETCH_STATUS = 0
    BEGIN
    
        EXEC ('USE '+@DatabaseName + '

        --foreach identity column
        DECLARE @tableName varchar(255)
        DECLARE @columnName varchar(255)
        DECLARE @schemaName varchar(255)
    
        DECLARE IdentityColumnCursor CURSOR READ_ONLY
        FOR
        
            select TABLE_NAME , COLUMN_NAME, TABLE_SCHEMA 
            from INFORMATION_SCHEMA.COLUMNS 
            where COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, ''IsIdentity'') = 1 
        

        OPEN IdentityColumnCursor

        FETCH NEXT FROM IdentityColumnCursor
        INTO @tableName, @columnName, @schemaName

        WHILE @@FETCH_STATUS = 0
        BEGIN
        
            print ''['+@DatabaseName+'].[''+@tableName+''].[''+@schemaName+''].[''+@columnName+'']'' 
            EXEC (''declare @MAX int = 0
                    select @MAX = max(''+@columnName+'') from ['+@DatabaseName+'].[''+@schemaName+''].[''+@tableName+'']
                    if (@MAX IS NULL)
                    BEGIN
                        SET @MAX = 0
                    END
                    DBCC CHECKIDENT(['+@DatabaseName+'.''+@schemaName+''.''+@tableName+''],RESEED,@MAX)'')

            FETCH NEXT FROM IdentityColumnCursor
            INTO @tableName, @columnName, @schemaName

        END

        CLOSE IdentityColumnCursor
        DEALLOCATE IdentityColumnCursor')



        FETCH NEXT FROM DatabasesCursor
        INTO @DatabaseName

    END

    CLOSE DatabasesCursor
    DEALLOCATE DatabasesCursor
END
GO

EXEC sp_configure 'show advanced options', 1 ;
GO
RECONFIGURE
GO
EXEC sp_configure 'scan for startup procs', 1 ;
GO
RECONFIGURE
GO



EXEC sp_procoption @ProcName = 'sp_FixSeeds2012' 
    , @OptionName = 'startup' 
    , @OptionValue = 'true' 
GO

Postgres no docker

 -- Criar compose nano docker-compose.yml version: '3.7' ### services:   db:     image: postgres     volumes:       - postgres_data:...