AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-124448

sepupic's questions

Martin Hope
sepupic
Asked: 2024-03-01 18:39:57 +0800 CST

DELETE falhou com erros: uma verificação de asserção do sistema falhou. + O intervalo está faltando prefixo na coluna de ID da partição

  • 7

Tenho tabela particionada com vários índices, todos estão alinhados e apenas um não. Isso ocorre porque ele controla a exclusividade por meio de mais de uma partição:

CREATE UNIQUE NONCLUSTERED INDEX [ix_uq_fltr_IdTransazioneRettificata_BM] ON [dbo].[Transazioni]
(
    [IdTransazioneRettificata] ASC
)
WHERE ([id]>(10000000000.) AND [StatusFatturazione]<>(15) AND [IdTransazioneRettificata] IS NOT NULL)
ON [PRIMARY]

O erro ocorre onde faço uma exclusão simples:

select id
into #t
from billing_prod2.dbo.Transazioni
where DataInserimento = '20240229' 
and Data = '20240201'
--(162.321 rows affected)

alter table #t add primary key(id)

delete t
from billing_prod2.dbo.Transazioni t
     join #t tt
        on t.id =  tt.id

A saída do SSMS:

Msg 3624, Nível 20, Estado 1, Linha 11 Uma verificação de declaração do sistema falhou. Verifique o log de erros do SQL Server para obter detalhes. Normalmente, uma falha de asserção é causada por um bug de software ou corrupção de dados. Para verificar se há corrupção no banco de dados, considere executar DBCC CHECKDB. Se você concordou em enviar dumps para a Microsoft durante a configuração, um mini dump será enviado à Microsoft. Uma atualização pode estar disponível na Microsoft no Service Pack mais recente ou em um Hotfix do Suporte Técnico. Msg 596, Nível 21, Estado 1, Linha 10 Não é possível continuar a execução porque a sessão está no estado kill. Msg 0, Nível 20, Estado 0, Linha 10 Ocorreu um erro grave no comando atual. Os resultados, se existirem, deveriam ser descartados.

A saída do log de erros:

Erro: 17065, Gravidade: 16, Estado: 1. Asserção do SQL Server: Arquivo: <"cxrowset.cpp">, linha = 2026 Asserção com falha = 'cstePrefix >= 1' O intervalo está sem prefixo na coluna de ID da partição. Este erro pode estar relacionado ao tempo. Se o erro persistir após a nova execução da instrução, use DBCC CHECKDB para verificar a integridade estrutural do banco de dados ou reinicie o servidor para garantir que as estruturas de dados na memória não estejam corrompidas. Erro: 3624, Gravidade: 20, Estado: 1. Falha na verificação de declaração do sistema. Verifique o log de erros do SQL Server para obter detalhes. Normalmente, uma falha de asserção é causada por um bug de software ou corrupção de dados. Para verificar se há corrupção no banco de dados, considere executar DBCC CHECKDB. Se você concordou em enviar dumps para a Microsoft durante a configuração, um mini dump será enviado à Microsoft.

Há também um arquivo de despejo que é longo o suficiente, mas se isso ajudar, posso colá-lo também.

Nada disso diz claramente qual índice tem problemas.

DBCC CHECKDBnão diz nada,

dbcc checktable('dbo.transazioni') with NO_INFOMSGS, ALL_ERRORMSGS

não diz nada.

A única coisa que eu poderia imaginar seria um índice que não é usado com frequência, caso contrário mais erros seriam relatados no log de erros, então comecei com este, não alinhado e menos usado.

Depois de descartá-lo, o erro desapareceu, então o problema realmente estava naquele índice não alinhado.

Alguém pode explicar isso?

O banco de dados tem TDE habilitado.

Microsoft SQL Server 2019 (RTM-CU22-GDR) (KB5029378) - 15.0.4326.1 (X64) 18 de agosto de 2023 14:05:15 Copyright (C) 2019 Microsoft Corporation Standard Edition (64 bits) no Windows Server 2016 Datacenter 10.0 ( Build 14393: ) (Hipervisor)

sql-server
  • 1 respostas
  • 113 Views
Martin Hope
sepupic
Asked: 2021-03-12 06:53:21 +0800 CST

A restauração do backup copy_only do banco de dados criptografado feito sem FORMAT, mas com INIT falha

  • 1

Tenho a tarefa de fazer cópias periódicas do banco de dados, duas vezes ao dia, e não devo quebrar nenhuma cadeia de backup nem acumular esses backups temporários. Então, tentei fazer um copy_onlybackup initpara substituir o único arquivo de backup.

Meu banco de dados é criptografado usando TDE .

Eu uso backup compressionno nível do servidor, "padrão de compactação de backup" é 1 no meu sys.configurations. Eu não uso a with compressionopção explícita no meu comando.

Aqui minha @@versão completa:

Microsoft SQL Server 2019 (RTM-CU8) (KB4577194) - 15.0.4073.23 (X64) 23 de setembro de 2020 16:03:08 Copyright (C) 2019 Microsoft Corporation Enterprise Edition (64 bits) no Windows Server 2016 Datacenter 10.0 (Build 14393) : ) (Hipervisor)

Meu problema é esse erro abaixo:

Msg 3241, Level 16, State 40, Line 8 A família de mídia no dispositivo 'W:\SQL_backup\copy_only\billing_prod2_test.bak' está formada incorretamente. O SQL Server não pode processar esta família de mídia. Msg 3013, Level 16, State 1, Line 8 RESTORE DATABASE está terminando de forma anormal.

Aqui está o código completo que executei:

backup database billing_prod2
to disk = 'W:\SQL_backup\copy_only\billing_prod2_test.bak'
with init, copy_only--, format;
go

restore database billing_1
from disk = 'W:\SQL_backup\copy_only\billing_prod2_test.bak'
with move 'billing_prod2' to 'E:\SQL_data\billing_1.mdf',
move 'billing_prod2_log' to 'E:\SQL_data\billing_1_log.ldf',
replace

A primeira vez que executa sem erros, o tamanho do backup completo é de cerca de 35Mb e restaura perfeitamente.

Na segunda vez, o backup é executado sem erros, mas estranhamente tem um tamanho de 260Mb. Esse é o tamanho que vejo no disco e o mesmo tamanho está escrito na saída do restore headeronlyque ainda executa sem erros. Mas quando eu faço restore databaseo erro mencionado acima aparece.

Tentei executar o mesmo código usando outro db e outro disco para salvar o backup mas o resultado é sempre o mesmo: na primeira vez funciona, na segunda vez o arquivo é sobrescrito mas tem tamanho diferente que não é apenas um tamanho duplo, é quase 10 vezes o tamanho inicial. restore headeronlynunca falha e sempre relata apenas um arquivo dentro do arquivo de backup, mas o tamanho é multiplicado e restore databasefalha.

sem formato

Somente quando adicionei formata opção, o tamanho do backup tornou-se normal e a restauração foi bem-sucedida.

com formato

Minha pergunta é: por que devo usar o formato com meu backup neste caso para poder restaurar?

sql-server backup
  • 1 respostas
  • 160 Views
Martin Hope
sepupic
Asked: 2020-12-30 08:40:44 +0800 CST

Por que ALTER AUTHORIZATION em uma tabela descarta todas as permissões no destino?

  • 0

Este fato está documentado aqui:

ALTER AUTHORIZATION (Transact-SQL)

Se a entidade de destino não for um banco de dados e a entidade estiver sendo transferida para um novo proprietário, todas as permissões no destino serão descartadas.

Eu não tinha ideia sobre isso até encarar o fato.

Um dia houve a necessidade de dar EXECUTEpermissão em cada procedimento armazenado existente/futuro para algum usuário, este usuário é um membro da db_datareaderfunção de banco de dados apenas e ele não deve ser capaz de modificar nenhum dado, mas desde que a cadeia de propriedade em vigor uma vez que ele tenha uma EXECUTEpermissão, ele seria capaz de modificar os dados através dos procedimentos armazenados. Então tive que quebrar a cadeia de propriedade e gerar um script que alterava a autorização em todas as tabelas existentes para algum outro usuário.

Assim que a autorização foi alterada, todas as permissões em todas as tabelas desse banco de dados desapareceram. Verifiquei a documentação mencionada acima e descobri que esse comportamento está documentado. Mas é bastante inesperado (para mim, pelo menos), então eu me pergunto se alguém tem alguma explicação. Por que eles fizeram isso? Por que há a necessidade de descartar todas as permissões em alguma tabela se a autorização nela foi alterada?

sql-server permissions
  • 1 respostas
  • 124 Views
Martin Hope
sepupic
Asked: 2020-05-15 10:01:59 +0800 CST

GROUPING SETS retornando resultados inesperados com expressão calculada

  • 8

Aqui temos duas consultas semelhantes usando grouping sets onde a SELECTcláusula contém algumas expressões calculadas em agregação:

SELECT RN10, RN10 / 10, COUNT(*) FROM 
(
       SELECT RN, RN/10 AS RN10, RN/100 AS RN100 FROM 
       (
               SELECT RN = -1 + ROW_NUMBER() OVER (ORDER BY 1/0) 
               FROM master..spt_values
       ) A
) B
GROUP BY GROUPING SETS ((RN10), (RN10 / 10), ())
ORDER BY 1, 2

seu plano está aqui: primeiro plano de consulta

e

SELECT RN10, SUBSTRING(RN,3,99), COUNT(*) FROM 
(
       SELECT RN, SUBSTRING(RN,2,99) AS RN10 FROM 
       (
               SELECT RN = CAST(-1 + ROW_NUMBER() OVER (ORDER BY 1/0) AS VARCHAR(99)) 
               FROM master..spt_values
       ) A
) B
GROUP BY GROUPING SETS ((RN10), (SUBSTRING(RN,3,99)), ())
ORDER BY 1, 2

o plano correspondente está aqui: segundo plano de consulta

Ambas as consultas primeiro calculam alguma expressão para agregação, RN10 / 10no primeiro caso e SUBSTRING(RN,3,99)no segundo, então a mesma expressão é usada na SELECTcláusula, mas como o primeiro plano mostra ela é recalculada na primeira consulta e não na segunda.

Como resultado, temos NULLs no primeiro conjunto de resultados que é bastante inesperado:

resultados

Alguém pode explicar porque a primeira consulta faz o cálculo 2 vezes (uma na agregação e mais uma vez na final select) enquanto a segunda faz apenas uma vez?

sql-server execution-plan
  • 1 respostas
  • 312 Views
Martin Hope
sepupic
Asked: 2019-12-17 01:57:27 +0800 CST

Às vezes, as linhas atualizadas não são bloqueadas em vez do gatilho de atualização

  • 7

Aqui está uma pequena reprodução:

create table dbo.t (id int primary key, v int);
insert into dbo.t values (1, 1), (2, 2);

create table dbo.s (id int primary key, v int);
insert into dbo.s values (1, 10);
go

create trigger dbo.tr_t__iou
on dbo.t
instead of update
as
begin
 set nocount on;

 exec sp_lock @@spid;
end;
go

update dbo.t set v = 10 where id = 1;

update t
 set
  v = 10
from
 dbo.s s join
 dbo.t t on t.id = s.id;

update t
 set
  v = 10
from
 (values (1, 10)) s(id, v) join
 dbo.t t on t.id = s.id;
go

drop table dbo.t, dbo.s;
go

sp_lockdentro dos triggerrelatórios U- key lockna linha afetada no primeiro e no último caso, mas no segundo caso não há lock, como isso pode ser explicado?

sql-server t-sql
  • 1 respostas
  • 331 Views
Martin Hope
sepupic
Asked: 2019-11-15 05:05:41 +0800 CST

Por que temos o Top N Sort neste exemplo?

  • 6

No exemplo abaixo o resultado de Index Spooljá está ordenado, por que temos Top N Sortaqui ao invés de simples Top?

use tempdb;
go

create table dbo.t1 (id int identity primary key, v int);
create table dbo.t2 (id int identity primary key, v int);

insert into dbo.t1
(v)
select top (1000)
row_number() over (order by 1/0)
from
master.dbo.spt_values a cross join
master.dbo.spt_values b;

insert into dbo.t2
(v)
select top (10000)
row_number() over (order by 1/0) + 10000
from
master.dbo.spt_values a cross join
master.dbo.spt_values b;

set statistics xml, io on;

select
sum(a.v + b.v)
from
dbo.t1 a outer apply
(select top (1) v from dbo.t2 where v >= a.v order by v) b;

set statistics xml,io off;
go

drop table dbo.t1, dbo.t2;
go

insira a descrição da imagem aqui

É reproduzível em todas as versões a partir de 2008 R2(só não tenho servidor com versões anteriores para testar)

sql-server optimization
  • 2 respostas
  • 126 Views
Martin Hope
sepupic
Asked: 2019-11-09 03:13:52 +0800 CST

SET IDENTITY_INSERT pode ser permitido com menos privilégios que db_ddladmin?

  • 4

Eu herdei um sistema onde o aplicativo está sendo executado em sysadminconta. Limitei essa conta a db_datareader+ db_datawriter+ EXECUTEem todo banco de dados e configurei extended eventsa sessão para pegar o permission errorsno servidor.
Foi muito surpreendente para mim ver algumas insertsfalhas, mesmo que o usuário seja membro db_datawritere nenhuma restrição granular nas tabelas seja aplicada.

Então observo que apenas as inserções que definiram IDENTITY_INSERTfalharam. O banco de dados em questão está cheio identitye há muito SET IDENTITY_INSERTem seu código. O código significa não apenas modulesarmazenado no servidor, mas também C#código.

Para poder definir identity_inserto usuário deve possuir a tabela ou ter ALTERpermissão na tabela. Mas o fato é que você NÃO PODE conceder ALTERapenas em tabelas , sou obrigado a conceder ALTERem um banco de dados inteiro para isso user (vou tornar esse usuário membro de db_ddladminrole que adicionará apenas 42 permissões(!!!) vs 51 permissões que poderiam ser adicionado às permissões do usuário, concedendo ALTERno banco de dados)

Não estou interessado em refatorar o banco de dados com sequence(a versão do servidor é 2014para que eu possa fazê-lo teoricamente) e não posso simplesmente adicionar execute as dboa todos os sp que uso identity_insertporque também há código de aplicativo para reescrever, só me pergunto por que a Microsoft faz algo tão estranho design de permissões que db_datawriternão pode definir identity_insert?

Existe outra maneira de fazer com que o usuário possa definir identity_insertque adicionará menos permissões do que db_ddladmin?


ATUALIZAR

Eu tentei a solução oferecida pelo LowlyDBA com synonyms:

create table dbo.t(id int identity);
go

alter schema sch transfer dbo.t;
go

create synonym dbo.t for sch.t;
go

set IDENTITY_INSERT dbo.t on;

Isso causa o erro

Msg 1088, Level 16, State 11, Line 1 Não é possível localizar o objeto "dbo.t" porque ele não existe ou você não tem permissões.

insira a descrição da imagem aqui


A solução de Antoine Hernandezconceder ao usuário ALTER apenas no esquema parece ser o menor dos males, então eu aceito

sql-server sql-server-2014
  • 2 respostas
  • 3773 Views
Martin Hope
sepupic
Asked: 2019-02-07 01:18:55 +0800 CST

Por que o primeiro plano de execução não usa RowCount Spool?

  • 6

Aqui está meu repro que foi testado em SQL Server 2008 R2, 2012, 2016.

A segunda e a terceira consultas usam RowCount Spool, por que a primeira não?

create table dbo.t (id int identity primary key, v int);
--create statistics ST_t__v on dbo.t(v) with norecompute;

insert into dbo.t (v)
select top (10000) rand(checksum(newid())) * 5
from master.dbo.spt_values a cross join
     master.dbo.spt_values b;
go

declare @v int;

set statistics xml, io on;
select @v = v from dbo.t where exists(select 1 from dbo.t where v = 4);
select @v = v from dbo.t where exists(select 1 from dbo.t where v = 4 having count(*) > 0);
select @v = v from dbo.t where exists(select 1 from dbo.t where v = 40);
set statistics xml, io off;
go

drop table dbo.t;
go

Como resultado, as estatísticas de IO são:

Table 't'. Scan count 2, ***logical reads 20024***, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


Table 't'. Scan count 2, logical reads 48, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.


Table 't'. Scan count 2, logical reads 27, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

insira a descrição da imagem aqui

sql-server optimization
  • 1 respostas
  • 231 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve