SQL Server 2008 视图正在丢失默认值

Posted

技术标签:

【中文标题】SQL Server 2008 视图正在丢失默认值【英文标题】:SQL Server 2008 view is losing the default value 【发布时间】:2015-10-12 09:17:33 【问题描述】:

我有一个奇怪的问题,在创建视图一段时间后,applicationID 的默认值丢失或重置(我们不知道为什么,我们有类似 0.000 或 0 或 null 的值)。

CREATE VIEW [schemaA].[tableA]
AS
    SELECT 
        *, 123456 applicationID
    FROM 
        [schemaB].[dbo].[tableA]

如果我们运行ALTER 语句,applicationID 的值将返回到最初定义的值。

ALTER VIEW [schemaA].[tableA]
AS
    SELECT 
        *, 123456 applicationID
    FROM 
        [schemaB].[dbo].[tableA] 

我需要提一下,在运行ALTER 语句之前,我们导出了视图DDL,它是正确的。

我如何确定是什么破坏了视图定义,或者视图是否应该有不同的定义(如果可能,可以设置一个默认值)。

谢谢

【问题讨论】:

applicationID 在任何情况下都是文字(固定)值吗?你的CREATE VIEWstatememt 和上面一样吗?如果没有,请发布完整的声明。 @Shnugo 这个值在创建时是固定的,和上面的语句完全一样 “固定于创作”究竟是什么意思?这个语句是由某种动态过程重新创建的吗?还是只创建一次就永不改变? 可能有人更改了表结构(添加了一些字段)并忘记重新编译视图 - 在这种情况下,如果视图定义包含 select *,而不是明确的字段列表,SQL 服务器会破坏视图结果。 @Arvo,根据您的评论,我在回答中的示例更加具体。事实上,这甚至会混淆类型......反对SELECT *的充分理由 【参考方案1】:

会是这样吗?

CREATE TABLE testTbl(aColumn INT);
INSERT INTO testTbl VALUES(1),(2);
GO

CREATE VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   1234
    2   1234
*/
GO

--be aware of the fact, that the new column is called newColumn and its type is varchar(5)!
ALTER TABLE testTbl ADD newColumn varchar(5);
GO
UPDATE testTbl SET newColumn='test';
GO

--The varchar value "test" comes under the column caption "applicationID"!
SELECT * FROM vwTestTbl;
/*
aColumn applicationID
    1   test
    2   test
*/
GO

--now you re-compile it with your attempt to ALTER the VIEW
ALTER VIEW vwTestTbl
AS
SELECT *,1234 applicationID
FROM testTbl;
GO

SELECT * FROM vwTestTbl;
/*
aColumn newColumn applicationID
    1   test      1234
    2   test      1234
*/
GO

--clean up
DROP VIEW vwTestTbl;
DROP TABLE testTbl;

【讨论】:

理论上可能,我不知道谁可能在运行“ALTER TABLE testTbl ADD applicationID INT NULL;” ,如果是,我怎样才能知道? @christi_b,不知道你的进程我不能告诉你......每个对象都有一个modify_date(试试SELECT * FROM sys.objects WHERE name='someName'你至少会发现,当一个对象最后一次被更改时... 看来这是最靠谱的情况

以上是关于SQL Server 2008 视图正在丢失默认值的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 视图中跨列计算特定值

sql server2008 怎么改变字段类型

Sql Server 2008 中缺少全文索引系统视图

如何创建跟踪 (SQL Server Profiler)

SQL Server 2008 查找丢失的行 [重复]

在 SQL Server 2008 中将两个表合并到一个索引视图中