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 VIEW
statememt 和上面一样吗?如果没有,请发布完整的声明。
@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 视图正在丢失默认值的主要内容,如果未能解决你的问题,请参考以下文章