O redimensionamento de uma coluna bloqueia a tabela?

O redimensionamento de uma coluna bloqueia a tabela?

O que acontece se eu alterar uma coluna de nvarchar(2) para nvarchar(10) ou uma coluna de char(2) para nvarchar(10). Isso trava, reorganiza a tabela ou funciona sem nenhum impacto ou tempo de inatividade?

Tentei descobrir o que acontece se eu alterar uma coluna, mas não encontrei nada. É uma tabela grande com uma ou duas colunas a serem alteradas. É sobre um MS SQL Server 2008 R2.

Responder1

A maneira mais fácil de descobrir seria usar um ambiente de teste, criar uma tabela fictícia e alguns registros fictícios aplicar a alteração mencionada e, em seguida, rastrear as ações por meio do criador de perfil.

OU Altere a tabela na tabela projetada no SSMS e use o botão 'Gerar script de alteração'. Quando mudo minha coluna de Char(2) para NVARCHAR(10). O script de geração de alteração produz o seguinte:

   CREATE TABLE dbo.Tmp_t2
    (
    id int NULL,
    c1 nvarchar(50) NULL,
    c2 nvarchar(2) NULL
    )  ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_t2 SET (LOCK_ESCALATION = TABLE)
GO
IF EXISTS(SELECT * FROM dbo.t2)
     EXEC('INSERT INTO dbo.Tmp_t2 (id, c1, c2)
        SELECT id, CONVERT(nvarchar(50), c1), c2 FROM dbo.t2 WITH (HOLDLOCK TABLOCKX)')
GO
DROP TABLE dbo.t2
GO
EXECUTE sp_rename N'dbo.Tmp_t2', N't2', 'OBJECT' 
GO
COMMIT

Responder2

Se você estiver usando os comandos ALTER, ele criará outra tabela, copiará os dados existentes para a nova tabela, eliminará a tabela antiga quando terminar e renomeará a nova tabela com o nome da tabela antiga. Não acho que seja uma prática recomendada fazer isso durante o banco de dados ativo, mas existem métodos para lidar com dados de produção.

http://www.sqlmag.com/article/tsql3/resizing-a-column-in-a-large-table.aspx

Responder3

Nenhuma outra operação (como inserir atualização excluir) pode ser feita quando o tipo de dados da coluna da tabela está sendo modificado, a tabela inteira será bloqueada. também não pode ser selecionado com NOLOCK.

informação relacionada