segunda-feira, 27 de abril de 2020

Não é possível restaurar um backup pequeno mesmo quando há espaço em disco

Se ao tentar restaurar um backup suficientemente pequeno para o espaço disponível em disco, mas que o SQL insiste em informar que não há espaço em disco, tente os comandos a seguir para reduzir os espaços alocados mas não utilizados do banco de dados e do arquivo de log. Em geral é o arquivo de Log que causa tais problemas, em especial nos bancos de muita transação. Por isso o exemplo abaixo vai encolher, ou shrink, o arquivo para o tamanho real (ou quase, já que podemos deixar uma margem reservada para ganho de desempenho ao precisar de novo espaço).

ALTER DATABASE <db_name>  SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE(<db_name>_log, 200);
GO
ALTER DATABASE <db_name> SET RECOVERY FULL;
GO

<db_name> = busque pelo nome lógico do banco nas propriedades > arquivos se o comando informar que não localizou o arquivo.

Também é possível fazer isso pela interface gráfica, mas o comando parece não funcionar, ou não executar imediatamente (deferred basis?). Na linha de comando sempre funcionou.

Para mais detalhes sobre o comando consulte a documentação.

Frases do erro: Restore of database failed. There is insufficient free space on disk.

quarta-feira, 19 de fevereiro de 2020

Selecionando e deletando registro duplicados


WITH TableWithRowID AS
(
 SELECT ROW_NUMBER() OVER (PARTITION BY ORDER BY ) AS RowID, 
  FROM
)
DELETE o
FROM TableWithRowID o
WHERE RowID > 1



Fonte:
https://www.mssqltips.com/sqlservertip/4486/find-and-remove-duplicate-rows-from-a-sql-server-table/

sexta-feira, 2 de agosto de 2019

Transferindo Report Server entre servidores

Se seu objetivo é transferir um report server de um servidor para outro, em especial entre versões atualizadas do SQL Server, é possível fazer com pouco esforço, de forma muito automatizada, usando uma ferramenta do próprio SQL Server Reporting Server (SSRS), com interface gráfica ou via console.

Na pasta de instalação do SSRS é possível encontrar a RS.exe, que faz o trabalho pesado de migrar relatórios e itens relacionados (pastas, data sources, etc). Em versões anteriores este .exe ficava na pasta Tools do SQL Server, mas agora a MS já melhorou isto alocando-o dentro da pasta do SSRS.

No link a seguir tem a RSMigrationTool com interface gráfica. Esta ferramenta também pode ser chamada via console.

https://www.microsoft.com/en-us/download/details.aspx?id=29560
Vídeo: https://www.youtube.com/watch?v=ZL8FqCcxBsU

A seguir temos as instruções para usar o RS.exe (sem firula, só console):
https://docs.microsoft.com/en-us/sql/reporting-services/tools/script-with-the-rs-exe-utility-and-the-web-service?view=sql-server-2017

Atenção: Lembre-se de conferir se o SQL Agent está rodando no servidor de destino para garantir que os jobs e agendamentos sejam executados.

Será necessário baixar um arquivo com as configurações do que deve ser baixado e que será usado como parâmetro no RS.exe: ssrs_migration.rss.
https://docs.microsoft.com/en-us/sql/reporting-services/tools/sample-reporting-services-rs-exe-script-to-copy-content-between-report-servers?view=sql-server-2017

Para executar na linha de comando, com o arquivo .rss baixado do github, segue um exemplo de sintaxe. Estou reproduzindo aqui apenas para facilitar, mas tem outros na pagína do link acima:
rs.exe -i ssrs_migration.rss -e Mgmt2010 -s https:///ReportServer -u Domain\User -p password -v ts="https:///reportserver" -v tu="Domínio\ContaUsuário" -v tp="" -v security="True"

A conta usada deve ter o mínimo de permissões para acessar o endpoint ReportServer de cada servidor. Normalmente é uma conta de administração de servidor ou com tais permissões.

Exemplo de um comando usado recentemente aqui na empresa (informações de segurança foram retiradas):
rs.exe -i ssrs_migration.rss -e Mgmt2010 -s http://servername_origem/reportserver -u dominio\usuario -p <senha> -v ts="http://servername_destino/reportserver" -v tu="dominio\usuario" -v tp="<senha>" -v security="True"

Você verá a mensagem: You can cancel the script after step 1 if you do not want to start the actual migration. Significa que o RS executa 2 fases: a primeira é um levantamento, e pode ser cancelada logo que concluída. Tudo que o RS conseguir acessar será listado. Se estiver satisfeito com o que foi listado, pressione ENTER para executar a segunda fase, a da transferência.


Verifique se tudo foi migrado de acordo.

Atualize os Data Sources se necessário, pois eles apontam para o mesmo lugar de antes, então se você migrou não só o Report Service, mas também o Database Server, terá que atualizar.

A parte de segurançao poder ser a mais difícil de migra (-v security="True"), então sempre confira se os usuários terão acesso ou se será necessário conceder novamente as permissões. Eu prefiro usar Autenticação integrada nos reports para evitar estas configs.

terça-feira, 23 de janeiro de 2018

Migrating SQL Server Profiler templates

After some hours trying to migrate a SQL Server Profiler 2008R2 template to 2014 I came to a result: It can´t be done directly inside the Profiler (not in a intuitive way). When you choose the destination version the list of profiles change and you lose the one you want to migrate. It seems to be not possible to migrate, even though you can find some steps in our beloved StackOverflow to do it. And, on that same site exists a tip which tells us to just copy and paste the .tdf files from one folder version to another, and voilá, we gotcha!

Well, that is the simplest and the best tip I´ve used to migrate templates.

Copy files from one version to another, using the template folder on:

%AppData%\Microsoft\SQL Profiler\\Templates\Microsoft SQL Server\

Good job!

quarta-feira, 26 de julho de 2017

Set vs Select para atribuir valores

Vejam neste artigo da SQLMagazine a importante diferença entre o uso do SET e do SELECT. Há coisas quase irrelevantes, mas há algumas pérolas no texto, como (1) a parte da subconsulta que retorna múltiplos valores, e (2) da atribuição de NULL.

http://www.sqlmagazine.com.br/artigos/sqlserver/07_SETxSELECT.asp (By Edison Costa)

Vale ressaltar que o erro abaixo:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Só ocorre pela forma da atribuição, e não porque foi usado o SET ou o SELECT.
Assim não dá erro:
SELECT @Variavel = from

Mas assim o erro acontece quando a subquery retorna mais de um resultado:
@Variavel = (subquery)

O caso em que não há o erro o resultado é não-determinístico, pois não sabemos qual valor dos retornados o SQL vai escolher para popular a @variavel.

terça-feira, 13 de junho de 2017

Two must read articles about Oracle RowNum

When thinking about rownum pseudocolumn for getting pages of record we have to read some articles to remember the issues about the way rownum works.

There are thousands of articles about, so, it's healthy to have a good backup of good articles in our pocket to avoid long time search:

http://www.oracle.com/technetwork/issue-archive/2006/06-sep/o56asktom-086197.html

https://explainextended.com/2009/05/06/oracle-row_number-vs-rownum/

If you know some better articles about rownum please share with us!

quarta-feira, 7 de junho de 2017

[SSRS] Relatório zebrado usando agrupamento

Ao usar listagens comuns no Report Server temos a boa e velha fórmula
= iif(RowNumber(Nothing) mod 2=0, "Cordesejada", "CorAlternativa")
para definir a alternância das cores das linhas, criando o efeito "zebrado".

Mas para os casos de relatórios que possuem agrupamentos e não é possível (ou facilmente) definir a ordem de renderização ou de enumeração das linhas e colunas, então a fórmula tradicional acima não funciona, ou pelo menos, não tem garantia de funcionar. Minha experiência é que não funciona mesmo quando tem agrupamento.

Para isto existe outra forma de configurar a alternância, que em meus testes deu certo até agora...

=iif(RunningValue(Fields![rowgroupfield_name].Value[.ToString],CountDistinct,Nothing) Mod 2,"Gainsboro", "White")

Há de se ter cuidado com agrupamentos que não preenchem todos os intervalos, pois podem causar problemas e confundir a fórmula, mas eu ainda não tive este problema. Há vários relatos deste problema nas discussões na Internet, inclusive para rotinas customizadas usadas no Report Code section ou com assemblies.

Fonte: https://stackoverflow.com/questions/44376/add-alternating-row-color-to-sql-server-reporting-services-report/6777983#6777983
Thanks to @ahmad.