Tenho duas tabelas temporais unidas por uma view, e quando altero a segunda tabela, e chamo sp_refreshview
, gera o erro:
A visualização ou função 'ViewTest' tem mais nomes de colunas especificados do que colunas definidas.
Percebi que depois de chamar sp_refreshview
, select *
na segunda tabela agora está incorporando as colunas ocultas de data e hora destinadas ao controle de versão do sistema.
Abaixo está o código de teste que escrevi para demonstrar o problema.
USE Test;
ALTER TABLE Department SET ( SYSTEM_VERSIONING = OFF)
GO
ALTER TABLE DepartmentTwo SET ( SYSTEM_VERSIONING = OFF)
GO
DROP TABLE IF EXISTS DepartmentTwo;
DROP TABLE IF EXISTS Department;
CREATE TABLE Department
(
DeptID INT NOT NULL PRIMARY KEY CLUSTERED,
DeptName VARCHAR(50) NOT NULL,
ManagerID INT NULL,
ParentDeptID INT NULL,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
CREATE TABLE DepartmentTwo
(
DeptID INT NOT NULL FOREIGN KEY REFERENCES Department(DeptId),
DeptTwoID INT NOT NULL PRIMARY KEY CLUSTERED,
ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo DATETIME2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON);
DROP VIEW IF EXISTS ViewTest;
GO
CREATE VIEW ViewTest
AS
SELECT
d.DeptName,
d.ManagerID,
d.ParentDeptID,
dt.*
FROM Department d
LEFT OUTER JOIN DepartmentTwo dt on d.DeptID = dt.DeptID
GO
ALTER TABLE DepartmentTwo ADD NewCol int;
GO
execute sp_refreshview 'ViewTest';
GO
select * from ViewTest;
Existe algum comportamento específico nas tabelas temporais que está fazendo com que as colunas de data e hora comecem a ser mostradas na visualização, mesmo que devam estar ocultas? Abaixo está um exemplo de como começa a incorporar as colunas de versão do sistema (ValidFrom, ValidTwo), com a instrução select gerada via SSMS:
/****** Script for SelectTopNRows command from SSMS ******/
SELECT TOP (1000) [DeptName]
,[ManagerID]
,[ParentDeptID]
,[DeptID]
,[DeptTwoID]
,[ValidFrom]
,[ValidTo]
,[NewCol]
FROM [Test].[dbo].[ViewTest]
Este é um bug que foi relatado anteriormente sem correção até o momento.
As pessoas recomendam não usar,
SELECT *
é claro, mas isso não é desculpa para que a atualização não funcione.Você nem precisa modificar uma tabela subjacente – a atualização da visualização ainda falha.
Na minha opinião, o recurso de tabelas temporais está incompleto e repleto de inconsistências como essa.
Perguntas e respostas relacionadas: