Meu entendimento aqui é que quando uma View é criada, a definição é armazenada em metadados sys.tables. ou seja sys.views
.
Além disso, se você usá SELECT * FROM
-lo, armazenará os nomes exatos das colunas, por exemplo SELECT a, b FROM
.
Mesmo se você usar a "CHECK OPTION" - ela ainda não será validada nas tabelas subjacentes.
"SCHEMABINDING", por outro lado, será validado nas tabelas subjacentes.
Meu problema é quando uma coluna em uma tabela é dropped
substituída por outra com o mesmo nome, mas computed
algo estranho acontece quando você consulta uma visualização com base nessa tabela.
Aqui está um exemplo.
DROP TABLE IF EXISTS dbo.Test1;
DROP TABLE IF EXISTS dbo.Test2;
GO
CREATE TABLE dbo.Test1
(
Id INT IDENTITY(1,1) PRIMARY KEY ,
Test1Col1 VARCHAR(80) NULL ,
Test1Col2 VARCHAR(80) NULL ,
Test1Col3 VARCHAR(80) NULL
);
CREATE TABLE dbo.Test2
(
Id INT IDENTITY(1,1) PRIMARY KEY ,
Test2Col1 VARCHAR(80) NULL ,
Test2Col2 VARCHAR(80) NULL ,
Test2Col3 VARCHAR(80) NULL ,
Test1Id INT
);
GO
INSERT INTO dbo.Test1
(Test1Col1, Test1Col2, Test1Col3)
VALUES
('Test1Col1Data1', 'Test1Col2Data1', 'Test1Col3Data1') ,
('Test1Col1Data2', 'Test1Col2Data2', 'Test1Col3Data2') ,
('Test1Col1Data3', 'Test1Col2Data3', 'Test1Col3Data3') ;
GO
INSERT INTO dbo.Test2
(Test2Col1, Test2Col2, Test2Col3, Test1Id)
VALUES
('Test2Col1Data1', 'Test2Col2Data1', 'Test2Col3Data1', 1) ,
('Test2Col1Data2', 'Test2Col2Data2', 'Test2Col3Data2', 2) ,
('Test2Col1Data3', 'Test2Col2Data3', 'Test2Col3Data3', 3) ;
GO
Crie uma visualização baseada em tabelas.
CREATE OR ALTER
VIEW dbo.View1
AS
SELECT T1.*, T2.*
FROM (
SELECT TestId = T.Id
FROM dbo.Test1 T
) T1
INNER JOIN dbo.Test2 T2 ON T2.Test1Id = T1.TestId ;
GO
SELECT * FROM dbo.View1 ;
GO
Você obtém este conjunto de resultados,
Agora eu ALTER
mesa dbo.Test2
.
DROP
coluna Test2Col3
e substituiu-a por uma computed
coluna com o mesmo nome.
ALTER TABLE dbo.Test2
DROP COLUMN Test2Col3 ;
ALTER TABLE dbo.Test2
ADD Test2Col3 AS Test2Col1;
GO
Agora, quando consulto a visualização, obtenho o seguinte conjunto de resultados.
SELECT * FROM dbo.View1 ;
GO
Os dados em colunas Test2Col3
pareciam Test1Id
ter deslocado 1 para a esquerda.
O que eu esperaria ver Test2Col3
está sendo mostrado Test1Id
e vice-versa.
Por que é isso?
Eu sei que uma atualização ou alteração da visualização corrigirá isso, mas os nomes das colunas não foram alterados. Eu repliquei isso no banco de dados SQL-2022 e Azure SQL.