Dicas sobre desenvolvimento de software, gestão e tributações

Rede Social

12 de maio de 2025

Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server


🔄 Como Executar o Mesmo SELECT em Todos os Bancos de Dados no SQL Server

Imagine que você precisa rodar a mesma consulta SQL em todos os bancos de dados de um servidor SQL Server — por exemplo, buscar registros em uma tabela chamada Clientes presente em vários bancos. Fazer isso manualmente pode ser demorado e propenso a erros. Neste post, vou te mostrar como automatizar essa tarefa utilizando cursores e SQL dinâmico.


🎯 O Que Vamos Fazer?

Vamos criar um script que:

  • Lista todos os bancos de dados do servidor (exceto os bancos do sistema).
  • Percorre cada banco de dados com um cursor.
  • Executa um SELECT dinâmico no contexto de cada banco.
  • Retorna os dados incluindo o nome do banco de onde vieram.

💻 O Código

DECLARE @dbname NVARCHAR(128)
DECLARE @sql NVARCHAR(MAX)

-- Cursor para percorrer os bancos de dados
DECLARE db_cursor CURSOR FOR
SELECT name 
FROM sys.databases
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb') -- Ignora bancos do sistema

OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @dbname  

WHILE @@FETCH_STATUS = 0  
BEGIN  
    SET @sql = '
    BEGIN TRY
        USE [' + @dbname + '];
        SELECT ''' + @dbname + ''' AS DatabaseName, * FROM Clientes
    END TRY
    BEGIN CATCH
        PRINT ''Erro no banco: ' + @dbname + ' - '' + ERROR_MESSAGE()
    END CATCH'
    
    EXEC sp_executesql @sql
    FETCH NEXT FROM db_cursor INTO @dbname  
END  

CLOSE db_cursor  
DEALLOCATE db_cursor

🧠 Entendendo o Script

🔹 sys.databases: Essa visão do sistema contém todos os bancos de dados do servidor. Filtramos os bancos do sistema (master, tempdb, etc.) para evitar acessos desnecessários.

🔹 Cursor: Um cursor percorre todos os bancos encontrados, armazenando o nome de cada um na variável @dbname.

🔹 SQL Dinâmico: Montamos dinamicamente uma string com o SELECT, usando USE [@dbname] para mudar o contexto do banco.

🔹 TRY...CATCH: Incluímos um bloco de tratamento de erros para evitar que um banco com problemas interrompa toda a execução.


🧪 Resultado

O script vai trazer os resultados do SELECT para cada banco, com uma coluna extra chamada DatabaseName para indicar de qual banco cada linha veio. Muito útil para consolidação de dados ou auditorias!


⚠️ Cuidados

  • Certifique-se de que a tabela (Clientes no exemplo) exista em todos os bancos.
  • Se os esquemas forem diferentes entre bancos, pode ser necessário adaptar o SELECT.
  • Evite rodar em produção sem testar antes — preferencialmente use um ambiente de homologação.

✅ Conclusão

Esse tipo de automação pode poupar horas de trabalho repetitivo e garantir mais consistência nas consultas em múltiplos bancos. Com uma abordagem simples de cursor + SQL dinâmico, conseguimos varrer o servidor inteiro de forma eficiente e controlada.

Se quiser estender essa técnica para UPDATE, INSERT ou verificações de estrutura, o princípio é o mesmo — apenas adapte o SQL gerado.

Ler

5 de maio de 2025

Como Definir Resultados-Chave (KRs) Relevantes para seus OKRs


No mundo empresarial, os OKRs (Objectives and Key Results) se tornaram uma poderosa ferramenta para definir metas e alcançar resultados com clareza e foco. Mas, enquanto o “Objetivo” é geralmente inspirador e direto, é nos “Resultados-Chave” que mora o segredo do sucesso. Afinal, como saber se estamos realmente avançando?

Neste post, você vai aprender a identificar resultados mensuráveis e eficazes para qualquer objetivo dentro da sua empresa


1. Entenda o Objetivo Primeiro


Antes de pensar em números, tenha certeza de que o seu objetivo é claro, qualitativo e indica uma direção desejada. Pergunte-se:

“O que eu quero alcançar?”

Exemplo: Aumentar a satisfação dos clientes.


2. Pergunte: “Como vou saber que alcancei isso?”


Agora pense nas métricas que indicam progresso real. Essa é a essência dos Key Results:

Quais dados me mostram sucesso?

O que posso medir para saber se melhorei?

Existe uma métrica que já usamos para isso?


3. Use Métricas Claras e Relevantes


Resultados-chave devem ser:

Quantitativos: sempre com números.

Objetivos: não dependem de opinião.

Atingíveis, porém desafiadores.


Exemplos de métricas:

Aumentar a taxa de conversão de 20% para 35%.

Reduzir o tempo de resposta do suporte de 24h para 12h.

Aumentar a nota média de avaliação do app de 3,8 para 4,5 estrelas.


4. Evite Confundir com Tarefas


Um erro comum é transformar os Key Results em atividades. Por exemplo:

Errado: Realizar pesquisa de satisfação.

Certo: Aumentar a pontuação de satisfação do cliente de 75 para 90


5. Checklist para Validar um Bom KR


Tem número?

Mede progresso?

Está ligado diretamente ao objetivo?

É possível de ser atingido no período definido?

Se a resposta for "sim" para tudo, você tem um bom Key Result.


Conclusão


Definir bons resultados-chave é o que transforma um objetivo inspirador em uma meta tangível e mensurável. É o que permite que equipes acompanhem seu progresso com clareza, tomem decisões baseadas em dados e celebrem conquistas reais.


Seus OKRs só funcionam quando os KRs são bem definidos.

Ler

14 de abril de 2025

Sql Server: Desabilitar Identity de coluna (permitir inserir)


 




No SQL Server, uma coluna com a propriedade IDENTITY é usada para gerar valores automáticos de forma incremental para registros inseridos na tabela. Isso é bastante útil quando queremos que a coluna tenha valores exclusivos e sequenciais, como um identificador (ID). No entanto, existem situações em que você pode precisar desabilitar ou essa propriedade de uma coluna já existente.

Para isso, podemos utilizar o comando SET IDENTITY_INSERT.

O que é o IDENTITY_INSERT?
O comando SET IDENTITY_INSERT permite que você insira explicitamente um valor em uma coluna que tenha a propriedade IDENTITY. Normalmente, o SQL Server gerencia automaticamente o valor dessa coluna (incrementando-o a cada inserção), mas em algumas situações, como ao importar dados ou corrigir registros, você pode precisar inserir um valor manualmente nessa coluna.

Quando o IDENTITY_INSERT está ativado para uma tabela, você pode especificar valores para a coluna IDENTITY durante a inserção, e o SQL Server vai aceitar esses valores, em vez de gerá-los automaticamente.

Sintaxe do Comando
A sintaxe básica do comando SET IDENTITY_INSERT é a seguinte:

SET IDENTITY_INSERT <nome_da_tabela> ON;

INSERT INTO <nome_da_tabela> (<coluna1>, <coluna2>, <colunaIDENTITY>, ...)
VALUES (<valor1>, <valor2>, <valorIDENTITY>, ...);

SET IDENTITY_INSERT <nome_da_tabela> OFF;

Explicação linha a linha
  1. SET IDENTITY_INSERT <nome_da_tabela> ON;: Ativa a inserção explícita na coluna IDENTITY da tabela.
  2. INSERT INTO <nome_da_tabela>: Insere os dados, incluindo valores para a coluna IDENTITY.
  3. SET IDENTITY_INSERT <nome_da_tabela> OFF;: Desativa a inserção explícita na coluna IDENTITY.

Cuidados ao Usar o IDENTITY_INSERT
Embora o comando SET IDENTITY_INSERT seja útil em várias situações, existem algumas considerações e cuidados importantes a serem observados:

Limitação por tabela: Você pode ter apenas um IDENTITY_INSERT ativo por vez. Isso significa que, se você tentar ativá-lo em várias tabelas simultaneamente, o SQL Server gerará um erro. Lembre-se de sempre desativar o IDENTITY_INSERT assim que terminar de usá-lo.

Integridade dos dados: Ao inserir manualmente um valor em uma coluna IDENTITY, o valor gerado automaticamente pode não seguir a sequência esperada. Isso pode causar problemas de integridade, como valores duplicados ou faltantes. Por exemplo, se você inserir explicitamente o valor 5, e depois tentar inserir outro valor sem especificar o ClienteID, o próximo valor será gerado automaticamente como 6. Isso pode gerar um gap na sequência de valores da coluna.

Desempenho: Embora o impacto no desempenho geralmente seja pequeno, o uso excessivo de IDENTITY_INSERT pode afetar a geração de índices e aumentar a carga de inserção na tabela. É importante utilizar o comando apenas quando necessário, como ao importar dados ou corrigir registros.

Quando Utilizar o IDENTITY_INSERT?
Aqui estão alguns cenários típicos em que você pode querer usar o comando SET IDENTITY_INSERT:

Importação de dados: Ao migrar dados de uma tabela para outra e preservar os valores existentes da coluna IDENTITY.

Restaurar dados: Durante a restauração ou recuperação de dados de backup, onde você precisa inserir valores manualmente.

Correção de valores: Quando há a necessidade de corrigir valores específicos de IDs em registros existentes, como ao tentar inserir dados com um ID específico ou corrigir falhas na sequência.

Conclusão
O comando SET IDENTITY_INSERT no SQL Server é uma ferramenta poderosa que permite inserir valores manualmente em colunas com a propriedade IDENTITY. Ele é útil em situações como importação de dados, recuperação de dados e correção de registros, mas deve ser usado com cautela para evitar problemas de integridade dos dados e desempenho. Lembre-se sempre de desativar o IDENTITY_INSERT após usá-lo e evite deixá-lo ativado por longos períodos.
Ler

7 de abril de 2025

SQL Server: Como obter linhas específicas do resultado com Row_Number


Essa função é extremamente útil quando você precisa atribuir um número sequencial a cada linha retornada pela consulta, como quando deseja limitar a quantidade de registros retornados ou criar uma ordenação personalizada.

Neste post, vamos explicar como utilizar a função ROW_NUMBER() no SQL Server e dar exemplos práticos de como ela funciona.


O que é o ROW_NUMBER() no SQL Server?

A função ROW_NUMBER() é usada para atribuir um número único e sequencial a cada linha de um conjunto de resultados. A numeração começa em 1 e é incrementada conforme as linhas são retornadas. Ela pode ser particularmente útil para criar relatórios, paginar resultados ou aplicar filtros de forma mais flexível.

O ROW_NUMBER() exige que você forneça uma cláusula ORDER BY, pois a numeração depende da ordem dos dados. Caso contrário, o SQL Server pode gerar a numeração de forma arbitrária.

A sintaxe básica do ROW_NUMBER() é:

SELECT ROW_NUMBER() OVER (ORDER BY [coluna]) AS RowNum, [outras_colunas] FROM [tabela];

ROW_NUMBER(): Função que gera o número sequencial.

OVER (ORDER BY [coluna]): Define a ordem das linhas. O número será atribuído com base nessa ordem.

RowNum: O alias (nome) dado à coluna que contém os números sequenciais.

Exemplo Prático

Vamos imaginar uma tabela chamada Funcionarios com as colunas ID, Nome e Salario. Suponha que você queira listar todos os funcionários e atribuir um número de linha a cada um deles, baseado no valor do salário (do maior para o menor).

Consulta:

SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios;

A função ROW_NUMBER() é utilizada para gerar um número sequencial, com base na ordenação dos salários em ordem decrescente (ORDER BY Salario DESC).

A consulta retornará uma lista de funcionários, com um número (RowNum) atribuído a cada linha, começando de 1 para o maior salário.


Limitando os Resultados com ROW_NUMBER()

Se você quiser apenas os 5 primeiros funcionários com os maiores salários, pode usar o ROW_NUMBER() em conjunto com uma subconsulta ou CTE (Common Table Expression) para filtrar os resultados. Por exemplo:

Consulta para obter os 5 funcionários com os maiores salários:

WITH FuncComRowNum AS ( SELECT ROW_NUMBER() OVER (ORDER BY Salario DESC) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM FuncComRowNum WHERE RowNum <= 5;

Explicação:

Usamos uma CTE (WITH FuncComRowNum AS (...)) para gerar a coluna RowNum para cada funcionário com base no salário.

Em seguida, filtramos os resultados na consulta principal, utilizando WHERE RowNum <= 5 para retornar apenas os 5 primeiros funcionários.


Usando ROW_NUMBER() para Paginação

Um dos usos mais comuns de ROW_NUMBER() é na paginação de resultados. Suponha que você tenha uma grande quantidade de dados e queira dividir os resultados em páginas de 10 itens. Você pode fazer isso utilizando a função ROW_NUMBER().

Exemplo para paginação de 10 itens por página:

WITH Pagina AS ( SELECT ROW_NUMBER() OVER (ORDER BY ID) AS RowNum, ID, Nome, Salario FROM Funcionarios ) SELECT ID, Nome, Salario FROM Pagina WHERE RowNum BETWEEN 11 AND 20; -- Página 2 (itens 11 a 20)

Explicação:

A CTE Pagina atribui um número de linha a cada funcionário, baseado no ID.

A consulta externa usa WHERE RowNum BETWEEN 11 AND 20 para pegar os registros da 11ª à 20ª linha, representando a segunda página de resultados.


Considerações Finais

A função ROW_NUMBER() oferece uma alternativa poderosa e flexível para atribuir números sequenciais às linhas de uma consulta. Com ela, você pode ordenar dados, implementar paginação e aplicar filtros complexos de maneira eficiente.

A função ROW_NUMBER() é muito útil em diversos cenários, como quando você precisa:

  • Ordenar resultados de maneira específica e numerada.
  • Realizar paginação de resultados em consultas grandes.
  • Trabalhar com filtros baseados em posição de linha.

Ler

31 de março de 2025

Sql Server: Listando todas as triggers com status e tipo


No SQL Server, triggers (ou gatilhos) são objetos que permitem que você defina ações automáticas a serem executadas quando certos eventos ocorrem em uma tabela ou vista. Por exemplo, você pode ter triggers que são acionadas quando dados são inseridos, atualizados ou excluídos em uma tabela. Elas são úteis para auditoria de dados, validações e outras ações automáticas.

Para listar todas as triggers de um banco de dados no SQL Server, podemos consultar as tabelas do sistema que armazenam informações sobre os objetos do banco de dados. Uma das principais views do sistema para isso é a sys.triggers, que contém informações sobre todas as triggers do banco de dados.

A consulta SQL básica para listar todas as triggers de um banco de dados é:

SELECT
t.name AS Nome_da_Trigger,
t.is_disabled AS Está_Desabilitada,
o.name AS Nome_da_Tabela,
t.type_desc AS Tipo_de_Trigger
FROM
sys.triggers t
INNER JOIN
sys.objects o ON t.parent_id = o.object_id
WHERE
o.type = 'U' -- 'U' representa tabelas de usuário
ORDER BY
t.name;


Explicação do Comando:

sys.triggers: Esta view contém informações sobre todas as triggers no banco de dados.

sys.objects: Esta view contém informações sobre os objetos no banco de dados (como tabelas, views, procedures etc.).

t.name: Nome da trigger.

t.is_disabled: Indica se a trigger está desabilitada (1 para desabilitada, 0 para habilitada).

o.name: Nome da tabela (ou view) associada à trigger.

t.type_desc: Descrição do tipo de trigger, como AFTER INSERT, INSTEAD OF DELETE, etc.

o.type = 'U': Filtra para retornar apenas triggers associadas a tabelas de usuário ('U' significa tabela de usuário).


Considerações sobre os tipos de triggers:

As triggers podem ser classificadas de acordo com os eventos que as acionam. Alguns exemplos incluem:

AFTER INSERT: A trigger é executada após a inserção de dados na tabela.

AFTER UPDATE: A trigger é executada após uma atualização na tabela.

AFTER DELETE: A trigger é executada após a exclusão de dados na tabela.

INSTEAD OF INSERT: A trigger substitui a ação de inserção.

INSTEAD OF UPDATE: A trigger substitui a ação de atualização.

INSTEAD OF DELETE: A trigger substitui a ação de exclusão.


Como identificar triggers associadas a uma tabela específica?

Se você deseja listar apenas as triggers de uma tabela específica, você pode adicionar um filtro no nome da tabela. Por exemplo, para listar as triggers associadas à tabela Produtos:

USE LojaDB;
GO

SELECT
t.name AS Nome_da_Trigger,
t.is_disabled AS Está_Desabilitada,
o.name AS Nome_da_Tabela,
t.type_desc AS Tipo_de_Trigger
FROM
sys.triggers t
INNER JOIN
sys.objects o ON t.parent_id = o.object_id
WHERE
o.type = 'U'
AND o.name = 'Produtos' -- Filtro para a tabela 'Produtos'
ORDER BY
t.name;


Considerações Finais

Listar e gerenciar triggers é uma tarefa fundamental para manter a integridade e a consistência dos dados em um banco de dados SQL Server. Triggers podem ser úteis em diversas situações, como garantir que certas condições sejam atendidas automaticamente após a inserção ou atualização de dados, ou até mesmo realizar auditoria de dados de forma automática.

Além disso, sempre é importante verificar se as triggers estão habilitadas ou desabilitadas, pois elas podem afetar o desempenho das consultas e a lógica de negócio. 

Ler

24 de março de 2025

Sql Server: verificar varchar nulo ou vazio


Como verificar se o texto de uma coluna do tipo VARCHAR está vazio ou se o campo está com conteúdo nulo no SQL Server

No SQL Server, é comum lidarmos com colunas do tipo VARCHAR para armazenar dados textuais. No entanto, ao realizar consultas ou manipulações de dados, podemos nos deparar com situações onde a coluna contém valores nulos (NULL) ou vazios (uma string com zero caracteres). Saber como tratar essas condições é essencial para garantir a integridade dos dados e otimizar as consultas.

No SQL Server, você pode usar as funções IS NULL e LEN() para realizar essas verificações.


Verificando se o valor é nulo:

O valor NULL é utilizado para representar dados ausentes ou desconhecidos. Para verificar se uma coluna contém um valor NULL, utilizamos a cláusula IS NULL.

SELECT *
FROM sua_tabela
WHERE sua_coluna IS NULL;

Esse comando retorna todas as linhas onde a coluna sua_coluna contém um valor nulo.


Verificando se o valor está vazio:

Para verificar se o valor de uma coluna VARCHAR está vazio, podemos usar a função LEN(). A função LEN() retorna o comprimento de uma string. Se o comprimento for 0, significa que a string está vazia.

SELECT *
FROM sua_tabela
WHERE LEN(sua_coluna) = 0;

Esse comando retorna todas as linhas onde a coluna sua_coluna contém uma string vazia.


Verificando se o valor é nulo ou vazio:

Para facilitar a verificação de ambas as condições — ou seja, se o valor é nulo ou vazio — podemos combinar as verificações usando a cláusula OR.

SELECT *
FROM sua_tabela
WHERE sua_coluna IS NULL OR LEN(sua_coluna) = 0;

Esse comando retorna todas as linhas onde a coluna sua_coluna é nula ou contém uma string vazia.


Como tratar os valores nulos e vazios?

Em alguns casos, você pode querer substituir valores nulos ou vazios por um valor padrão, como "Desconhecido". Para isso, você pode usar a função COALESCE ou ISNULL para substituir valores nulos. Se a coluna contiver uma string vazia, você pode usar a função NULLIF para tratá-la.


Usando COALESCE para substituir NULL por "Desconhecido":

SELECT COALESCE(Endereço, 'Desconhecido') AS Endereço
FROM Clientes;

Esse comando substitui qualquer valor NULL na coluna Endereço por "Desconhecido".


Usando NULLIF para tratar valores vazios:

Se você também quiser tratar valores vazios, pode combinar NULLIF e COALESCE:

SELECT COALESCE(NULLIF(LEN(Endereço), 0), 'Desconhecido') AS Endereço
FROM Clientes;

Nesse caso, a função NULLIF(LEN(Endereço), 0) vai retornar NULL para as linhas onde a coluna Endereço estiver vazia (comprimento igual a 0). Em seguida, a função COALESCE substitui esses valores por "Desconhecido".


Considerações Finais

É muito comum encontrar dados nulos ou vazios em bancos de dados. Saber como tratá-los corretamente ajuda a garantir que suas consultas e operações de dados sejam feitas de forma eficiente e sem erros inesperados.

Se você tiver dúvidas ou sugestões, deixe um comentário abaixo!

Ler

1 de dezembro de 2021

SQL Server: Como pesquisar tabelas em todos os bancos de dados





Nesse post vou mostrar um script para pesquisar as tabelas de todos os bancos de dados que contenham um nome ou parte de nome específico. Ao final vai mostrar um resumo de quantas ocorrências da tabela procurada foram encontradas em cada banco.


 DECLARE @tabelas TABLE(nome_database SYSNAME,

                       nome_schema   SYSNAME,

                       nome_tabela   SYSNAME);

DECLARE @database SYSNAME;


SET NOCOUNT ON;


DECLARE bases CURSOR LOCAL FAST_FORWARD FOR

  SELECT d.name

    FROM sys.databases d

    where d.state = 0;

OPEN bases

FETCH NEXT FROM bases INTO @database

WHILE @@FETCH_STATUS = 0

BEGIN

  INSERT INTO @tabelas(nome_database,

                       nome_schema,

                       nome_tabela)

  EXEC('SELECT ''' + @database + ''',

               s.name,

               t.name

          FROM ' + @database + '.sys.tables t

               INNER JOIN ' + @database + '.sys.schemas s ON s.schema_id = t.schema_id

         WHERE t.name LIKE ''%cliente''');


  FETCH NEXT FROM bases INTO @database;

END;

CLOSE bases;

DEALLOCATE bases;


SELECT *

  FROM @tabelas;


-- Resumo

SELECT nome_database,

       count(1) AS quantidade

  FROM @tabelas t

 GROUP BY nome_database;

A parte que você deve alterar para o nome da sua tabela fica na linha
WHERE t.name LIKE ''%cliente''');
No caso estou procurando todas as tabelas que terminem com o texto 'cliente'

Ler

10 de novembro de 2021

SQL Server: Listar as chaves do banco de dados





Nesse script vou mostrar como exibir as constraints (chaves estrangeiras) que já estão criadas no banco de dados, nele vou exibir o nome das tabelas ligadas, os nomes das tabelas e o nome da chave.

SELECT

    FK.TABLE_NAME,

    COLUMNUSAGE.COLUMN_NAME,

    PK.TABLE_NAME,

    PT.COLUMN_NAME,

    CONSTRAINTS.CONSTRAINT_NAME

FROM

    INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS CONSTRAINTS

INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS FK

    ON CONSTRAINTS.CONSTRAINT_NAME = FK.CONSTRAINT_NAME

INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK

    ON CONSTRAINTS.UNIQUE_CONSTRAINT_NAME = PK.CONSTRAINT_NAME

INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE COLUMNUSAGE

    ON CONSTRAINTS.CONSTRAINT_NAME = COLUMNUSAGE.CONSTRAINT_NAME

INNER JOIN (

            SELECT

                i1.TABLE_NAME,

                i2.COLUMN_NAME

            FROM

                INFORMATION_SCHEMA.TABLE_CONSTRAINTS i1

            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE i2

                ON i1.CONSTRAINT_NAME = i2.CONSTRAINT_NAME

            WHERE

                i1.CONSTRAINT_TYPE = 'PRIMARY KEY'

           ) PT

    ON PT.TABLE_NAME = PK.TABLE_NAME


Caso você esteja procurando por uma chave em específico você pode utilizar o where com o nome da chave por exemplo:

WHERE CONSTRAINTS.CONSTRAINT_NAME LIKE '%FK_MINHACHAVE%'


ou então caso esteja procurando todas as chaves relacionadas com uma coluna:

        WHERE COLUMNUSAGE.COLUMN_NAME LIKE '%NOMEDACOLUNA%'

Ler

4 de maio de 2021

Cloud: Quais os benefícios da computação em nuvem



 

Principais benefícios da computação em nuvem  

Computação em nuvem já não é nenhuma novidade, mas mesmo assim muitos ainda não conhecem o termo ou seu uso e nem por que se tornou tão conhecida e utilizada, vou mostrar seis motivos e vantagens desse tipo de serviço.

Custos: Computação em nuvem pode reduzir bastante os custos com a operação de TI, isso porque você não precisará investir na compra de equipamentos e aplicativos para controlar um datacenter local, não precisará dispor de um espaço para servidores e equipamentos de rede, um local de acesso, temperatura, energia e resfriamento controlados por exemplo, poderá reduzir o número de especialistas de TI que seriam responsáveis por manter o datacenter operante.

Escalabilidade: Computação em nuvem facilita muito a escalabilidade do datacenter, podendo ser inclusive elástico. Imagine que você tem uma demanda maior apenas em alguns meses do ano ou então em alguma semana do mês, até mesmo um horário específico do dia, com computação em nuvem você pode contratar um serviço de dimensionamento elástico onde você configura um período que deseja ter mais poder de memória ou de processamento e passado esse período o serviço volta às definições padrões e você paga apenas pelo que usa, pense se fosse necessário comprar mais servidores para usá-los apenas uma semana do mês e nas outras semanas ele ficaria parado não gerando nenhum lucro.

Facilidade: A maioria dos serviços em nuvem é simples de ser configurado, você faz tudo por um navegador web, desde aquisição até configuração do mesmo em alguns minutos, pensando em ter o seu próprio datacenter apenas o fato de ligar e configurar todos os equipamentos pode levar vários dias. Além de ter que testar tudo, caso precise de alguma manutenção (coisa muito normal em datacenters) você precisará de um profissional para identificar o problema e corrigi-lo, além de caso o problema seja o mau funcionamento de algum equipamento ter que providenciar um novo. Na computação em nuvem não tem nada disso uma vez que a responsabilidade é total por parte do contratado. A produtividade da sua equipe pode aumentar muito já que terá profissionais focados na solução dos problemas e não no funcionamento e manutenção do datacenter.

Desempenho e segurança: Os grandes serviços de computação em nuvem são preparados para fornecer um alto padrão de conectividade, mantendo equipamentos e softwares sempre atualizados, mantendo sempre mais de um link de acesso à internet, backups programados, ambientes controlados, além é claro de uma preocupação constante com a segurança de seus servidores tanto física quanto à ataques de hackers.


Existem vários modelos de nuvens, no meu post anterior expliquei o assunto.

Ler

27 de abril de 2021

Cloud: Modelos de serviços de nuvem



Modelos de serviços de nuvem: IaaS, PaaS e SaaS 

Os serviços de nuvem estão atualmente divididos em quatro grupos: IaaS (infraestrutura como serviço), PaaS (plataforma como serviço), SaaS (software como serviço) e sem servidor. É muito importante se saber a diferença entre esses tipos para ter a melhor opção de nuvem possível trabalhando para você.

Caso não tenha visto o post anterior onde falo sobre os tipos de nuvens sugiro que leia antes.


IaaS (infraestrutura como serviço)

É o tipo mais comum de computação em nuvem, nele se aluga uma infraestrutura de TI, que pode ser, servidores, máquinas virtuais, armazenamento, redes e etc. Onde o pagamento é pelo uso e quantidade de recursos locados.


PaaS (plataforma como serviço)

A plataforma como serviço fornece sob demanda um ambiente para desenvolvimento, teste e gerenciamento de aplicativos. Foi criado pela necessidade de desenvolvedores de software em ter um lugar seguro, com boa infraestrutura e facilidade em hospedar seus aplicativos e sites, sem ter a preocupação de criar todo um data center para isso, onde se teria que adquirir e configurar diversos equipamentos, local controlado, armazenamento, infraestrutura de rede, de energia e toda a manutenção de tudo isso.


SaaS (software como serviço)

A nuvem do tipo software como serviço é uma forma de distribuição de aplicativos pela internet, o mais comum a vincular o contratante com uma forma de assinatura. Assim o usuário não tem nenhuma preocupação em como é feita a aplicação ou onde está hospedada, apenas a usa através da internet, podendo ser com um navegador web em computador, tablet, smartphone, ou diretamente com o download do aplicativo que acessa a internet.

Ler

20 de abril de 2021

Cloud: Tipos de nuvens




Tipos de nuvem

Inicialmente vamos falar sobre os tipos de implementações da nuvem, as opções são pública, privada ou híbrida.


Nuvem pública

A nuvem pública é pertencente e administrada por um provedor terceirizado, que por sua vez fornecem serviços de servidores, armazenamento ou aplicações pela internet. Alguns exemplos de nuvens desse tipo são: Microsoft Azure, Google cloud e Amazon AWS.

Nesse tipo de nuvem toda a parte de hardware, software, infraestruturas como local, energia e temperatura são de propriedade e gerenciadas por esse provedor. Ao contratar esse serviço você só precisará definir o que vai querer que ele contenha como se fosse fazer um plano de telefonia, quanto mais recursos mais caro e geralmente se faz todo por um navegador de internet inclusive a maioria deles é altamente parametrizável.


Nuvem privada

A nuvem privada como o nome já diz é uma nuvem utilizada por uma única organização. Essa nuvem pode estar tanto fisicamente dentro da própria empresa quanto pode ser contratada de uma empresa terceirizada, mas não se confunda com uma nuvem pública, nesse caso por mais que possa ser terceirizada, apenas uma empresa tem acesso à essa nuvem. Então em resumo uma nuvem privada mantém os serviços e infraestrutura em uma rede privada.


Nuvem híbrida

Nuvem híbrida como se pode imaginar é a combinação das duas nuvens, onde elas são ligadas por alguma tecnologia ou serviço, isso é bastante útil quando você possui uma nuvem privada e quer expandir apenas em alguns serviços em específico, podendo por exemplo ter a nuvem privada com a parte de armazenamento e o processamento na nuvem pública contratada ou então utilizar a nuvem pública apenas em momentos sazonais de maior necessidade de processamento, enfim as possibilidades são muitas nesse formato.


Ler

9 de março de 2021

Como remover serviços do Windows


 


Essa dica vai tanto para o pessoal que trabalha com a infraestrutura de uma empresa quanto para quem desenvolve softwares e desenvolve serviços no windows.

Algumas vezes nos deparamos com algum serviço com problemas e precisamos removê-lo. Quando se fala em desenvolvimento de serviço é bem comum instalar, testar, remover, instalar novamente e assim por diante.

Primeiro você precisa saber o nome exato do serviço que quer desinstalar, caso já saiba pode pular os próximos passos até chegarmos no cmd.exe, caso não saiba, vamos pesquisar.

Para isso vamos acessar os serviços instalados, podendo ser pela pesquisa na barra de tarefas.


ou pressionando windows + r e digitando services.msc



Abrirá a tela de serviços, localize o serviço desejado, clique com o botão direito sobre ele e depois em propriedades, irá aparecer uma tela como essa. O nome do serviço é o que está no retângulo vermelho.


Agora você irá no cmd, novamente windows + r e digite cmd.exe, ou pesquise por cmd na barra de tarefas do windows (caso não seja usuário administrador, poderá ser necessário abrir o cmd como administrador)



Já no cmd é só digitar sc delete e o nome do serviço



Ler

9 de fevereiro de 2021

Marketing Digital: Site one-page / mini-site



Os sites one-page são um dentre os mais populares atualmente, isso porque eles são compactos, simples e resumem todo o conteúdo em uma única página. Geralmente ele é subdividido em seções para manter uma boa organização e fácil leitura. Voltado para empresas ou produtos para um publico mais atualizado que não tem muito tempo para ler um site grande inteiro para descobrir do que a empresa se trata, aqui a ideia é ser "vapt-vupt".

Algumas vantagens desse tipo de site:
    1. Carregamento rápido, já que não tem muitas páginas para serem carregadas.
    2. Exibe o conteúdo de maneira minimalista tornando de mais fácil absorção.
    3. Fácil navegação afinal está tudo em uma página só, não haverão conteúdos difíceis de encontrar ou ignorados pelo leitor.
    4. Mais simples de tornar completamente responsivo (aqueles sites que se adaptam à qualquer tipo de dispositivo como, computador, celular, tablet etc.).

Algumas desvantagens:
    1. Não há muito espaço para conteúdos, claro a intenção desse tipo de site é ser simples e direto ao ponto
    2. Não tem como fazer um SEO muito completo.

Esse tipo de site está tendo uma alta demanda por juntar um bom custo com uma alta eficácia.

Aqui alguns exemplos de sites one-page.
Ler

4 de fevereiro de 2021

C#: Método Compute



Recentemente estive trabalhando com data tables e me deparei com a situação de ter uma consulta armazenada em um data table e precisava somar os valores de uma coluna contida nele, para isso utilizei o método Compute, vou mostrar como.


Imagine que temos um data table simples com duas colunas, nome do cliente (nome) e total de compras(tot_compras) e eu quero saber a soma do total de todos os clientes.

DataTable tabela = MinhaTabela;
var somaTotal = table.Compute("Sum(tot_compras)", "");

Agora complicando um pouco mais, imagine que na mesma tabela eu tenha mais uma coluna indicando se o cliente é pessoa Física '1' ou Jurídica '0' na coluna (tipo_cliente) como faria se quisesse apenas a soma dos clientes físicos?

somaTotal = table.Compute("Sum(tot_compras)", "tipo_cliente = 1");

Ler

15 de dezembro de 2020

UML: O que é e como funciona


 Unified Modeling Language é uma linguagem de notação muito utilizada em projetos de desenvolvimento de softwares, mas seu uso não se resume apenas a software, ela pode ser usada para muitos tipos de planejamentos e projetos.

Ela é construída através de diagramas que são compostos por elementos gráficos relacionados entre si e com pequenos textos que os descrevem.

Existem vários tipos de diagrama e vou mostrar os mais utilizados abaixo:

Diagrama de casos de uso
O caso de uso documenta o que o sistema faz do ponto de vista do usuário. Esse é o mais conhecido e o que mais se aplica a diversas situações não apenas a desenvolvimento de software.
Ele possui:
- Atores (usuários, equipamentos ou sistemas interligados)
- Casos de uso (as funcionalidades do sistema)
- Comunicação (o que liga o usuário com a funcionalidade realizando uma ação)

Diagrama de caso de uso – Wikipédia, a enciclopédia livre


Diagrama de classe
O diagrama de classes serve para mostrar a estrutura da aplicação, muitas vezes utilizado para planejamento do banco de dados, ou seja este é específico para desenvolvimento de software.

Modelos e Exemplos de Diagrama de Classe Online | Creately


Diagrama de sequência
Diagrama de sequencia mostra a sequencia de ações que um usuário pode fazer (lembre que usuário pode ser uma pessoa, outro sistema, um equipamento etc.)

Ele vai ter um usuário, os elementos gráficos que representam cada etapa e as setas que indicam uma ação seja do usuário (seta para frente) ou da etapa requisitando uma ação do usuário (seta para trás)

 

Diagrama de Atividades
O diagrama de atividades serve para ilustrar as ações que podem ser tomadas na aplicação, juntamente com suas condições e consequências.

UML - Diagrama de Atividades - Purainfo


Ferramentas para UML
ArgoUML http://argouml.tigris.org/
Astah http://astah.net/editions/community
Draw http://draw.io não é focada em UML

Ler

8 de dezembro de 2020

SQL Server: Como saber os últimos comandos executados


 SQL Server Express - Backup, Recursos, Comparando edições

No post de hoje irei mostrar uma forma simples de verificar quais foram os últimos comandos executados no SQL Server, detalhe que são para comandos que ainda estão em chache do SQL não para qualquer comando de qualquer data.

SELECT TAB.TEXT
FROM SYS.DM_EXEC_CACHED_PLANS AS PLANS
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(PLANS.PLAN_HANDLE) AS TAB


Com esse comando são exibidos os comandos no cache, aqui vale bastante colocar cláusulas where pois muitas vezes são exibidos comandos internos do que o SQL server executa então vamos à um exemplo.


SELECT TAB.TEXT
FROM SYS.DM_EXEC_CACHED_PLANS AS PLANS
CROSS APPLY SYS.DM_EXEC_SQL_TEXT(PLANS.PLAN_HANDLE) AS TAB
WHERE TAB.TEXT LIKE '%UM TEXTO DO MEU COMANDO%'

Com um where junto a um like podemos procurar parte do que está escrito no comando.

Ler

17 de novembro de 2020

SQL: Converter tempo decimal em horas e minutos





No post de hoje irei mostrar algumas formas de transformar horas em decimal, no meu caso essa necessidade surgiu porque a funcionalidade grava as horas de uma tarefa no formato decimal, pois o usuário desejava ver essa quantidade de tempo em decimal e também realizar alguns cálculos, mas depois de certo tempo ele quis também um relatório onde exibisse a quantidade de tempo no formato de horas (time)

A primeira forma que vou mostrar é para converter para varchar, isso porque o período de tempo poderia ultrapassar as 24 horas que o formato time do sql suporta

DECLARE @HORAS decimal(7,4) = 25.5599
SELECT
RIGHT('0' + CAST (FLOOR(@HORAS ) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST(FLOOR((((@HORAS * 3600) % 3600) / 60)) AS VARCHAR), 2) + ':' +
RIGHT('0' + CAST (FLOOR((@HORAS * 3600) % 60) AS VARCHAR), 2)

Caso não ocorra nunca a possibilidade de passar das 24 horas você pode converter para o formato time de uma forma mais simples.

DECLARE @HORAS decimal(7,4) = 20.5599
SELECT  CAST(CONVERT(VARCHAR,DATEADD(SECOND, @HORAS * 3600, 0),108) AS TIME)

Ler

27 de outubro de 2020

Python: List Slices


 Como executar seu código python diretamente no Sublime-Text | by Willyan  Guimarães | experienceCode | Medium

No post de hoje vamos ver uma forma bem interessante e que facilita bastante para se obter valores de listas.
Imagine que temos uma lista de ints conforme a lista abaixo.

list = [0, 1, 5, 8, 14, 27, 31, 45, 63, 76]

E eu quero imprimir na tela os valores das posições 2 até a 5, normalmente pensaríamos em um loop como um for, mas em Python temos uma forma bem simples de resolver isso.

print(list[2:6])

Com esse comando o retorno seria:

[5, 8, 14, 27]

Ou seja os ints nas posições 2 (não se esqueça que a contagem começa do zero), até a posição 5 (a posição 6 não é selecionada por mais que se tenha colocado 6 no comando).

Também podemos omitir um dos dois parâmetros, seja o primeiro que é o número inicial ou o segundo que é o número final
Se eu executar o comando:

print(list[:5])

Seria a mesma coisa que executar o comando print(list[0:5]).

E se executar
print(list[7:])

Ele vai imprimir à partir da posição 7 até o final da lista.

List slices também pode ser usado com um terceiro parâmetro que serve para indicar a quantidade de posições à percorrer de cada vez, como por exemplo:

print(list[2:9:2])

O resultado irá imprimir à partir da posição 2 até a posição 9 de dois em dois como o abaixo:

[5, 14, 31, 63]

 

Também temos a opção de colocar um número negativo no terceiro parâmetro, isso faz com que a lista seja retornada ao contrário como por exemplo:

 print(list[7:4:-1])

Retorno:

[45, 31, 27]

Ler

15 de outubro de 2020

Python: Uma função Pythônica para validar CNPJ



Seguindo a ideia do post anterior, onde mostrei uma solução para a validação de CPF, falarei hoje sobre a validação de CNPJ. Mas como o cálculo é bem parecido, vou destacar apenas as diferenças entre eles.

 

Para a validação do CPF, os pesos aplicados aos seus dígitos vão de 2 a 11. Para o CNPJ, os pesos vão de 2 a 9 e então reiniciamos os pesos (novamente em 2). E, assim como para o CPF, os pesos são aplicados da direita para a esquerda.


Vamos usar o CNPJ (gerado aleatoriamente) 90.306.453/0001-33 como exemplo.

Ao aplicarmos os pesos teremos as seguintes associações:

9
0
3
0
6
4
5
3
0
0
0
1

5

4

3

2

9

8

7

6

5

4

3

2

Sem contar o primeiro DV.

E

9
0
3
0
6
4
5
3
0
0
0
1
3
6
5
4
3
2
9
8
7
6
5
4
3
2

Contando o primeiro DV.


Como a partir da aplicação dos pesos o algoritmo é exatamente o mesmo ao do CPF, vamos direto para o código.

 

from itertools import cycle

LENGTH_CNPJ = 14


def is_cnpj_valido(cnpj: str) -> bool:
if len(cnpj) != LENGTH_CNPJ:
return False

if cnpj in (c * LENGTH_CNPJ for c in "1234567890"):
return False

cnpj_r = cnpj[::-1]
for i in range(2, 0, -1):
cnpj_enum = zip(cycle(range(2, 10)), cnpj_r[i:])
dv = sum(map(lambda x: int(x[1]) * x[0], cnpj_enum)) * 10 % 11
if cnpj_r[i - 1:i] != str(dv % 10):
return False

return True


if __name__ == "__main__":
print("CNPJs inválidos")
print(is_cnpj_valido("0"))
print(is_cnpj_valido("123456789012345"))
print(is_cnpj_valido("5" * LENGTH_CNPJ))
print(is_cnpj_valido("90306453000103"))
print(is_cnpj_valido("90306453000130"))
print("CNPJs válidos")
print(is_cnpj_valido("90306453000133"))
print(is_cnpj_valido("82671952000100"))
print(is_cnpj_valido("31049514000165"))
print(is_cnpj_valido("77437514000133"))
print(is_cnpj_valido("00059549000151"))


Temos apenas 3 diferenças entre os códigos de validação de CNPJ e CPF, que são:

1. A importação da função "cycle" do pacote "intertools"

2. O tamanho da constante que é 14 para CNPJ

3. O método da aplicação dos pesos.


Como são apenas estas as diferenças, e a importação e o tamanho da constante não precisam maiores explicações, vou explicar apenas a parte dos pesos. (Para a explicação do restante do algoritmo, acesse o post do CPF).


Para aplicar os pesos do CPF, nós fazemos uso da função "enumerate", porém não podemos fazer o uso da mesma função para o CNPJ, pois os pesos do CNPJ não são sequenciais, uma vez que a sequência é reiniciada ao atingir o valor 9.

Para atendermos esta particularidade, fazemos uso de 3 funções: "range", "cycle" e "zip". Como todas são funções que merecem posts específicos para explicá-las, vamos apenas resumir como elas agem no algoritmo.

A função range irá nos retornar um iterável que se inicia em 2 e termina em 9 (o 10 não é incluso).

Este iterável é recebido pela função cycle, que por sua vez devolve um objeto "itertools.cycle". Vamos dizer que esse objeto é tipo um "iterável infinito", pois se fizermos um "for" nele, o loop "nunca" será finalizado.

Por fim pegamos este "iterável infinito" e o iterável com os dígitos invertidos do CNPJ e passamos para a função zip. A função irá unir estes 2 iteráveis, limitando o resultado pelo tamanho do menor iterável (neste caso o CNPJ). Com isso teremos todos os dígitos do CNPJ com seus respectivos pesos aplicados, similar ao que a função enumerate faz com o CPF.

A partir daqui segue igual ao que é feito com o CPF.

Ler

13 de outubro de 2020

Python: Particularidades com números em Python


Como executar seu código python diretamente no Sublime-Text | by Willyan  Guimarães | experienceCode | Medium 

No post de hoje vou mostrar algumas particularidades quando estamos tratando números em Python.


Imagine que eu tenho um número 25555777, quando olhamos para ele fica um pouco complicado de rapidamente saber qual número é, mas em Python podemos utilizá-lo de maneira mais amigável ao ser humano como 25_555_777 pronto fica muito mais fácil de saber que o número é 25 milhões, 555 mil e 777, o compilador entende isso normalmente.

Outro exemplo é quando eu quero utilizar apenas a parte inteira de um número decimal, por exemplo 7 / 3 é 2,33333, caso queira saber apenas qual o número inteiro ignorando a parte decimal eu poderia converter com um cast int (7 / 3) que ele me retornaria 2, mas um forma mais fácil e rápida seria 7 // 3 com duas barras, também me retornará 2. Inclusive pode ser utilizado em cálculos mais extensos.

Mais uma seria particularidade é que os números não tem o mesmo limite que outras linguagens, um inteiro pode ter o tamanho até que a memória da máquina suporte e não o tamanho do tipo inteiro.

Ler