在另一个模式中查看一个模式和表

时间:2013-12-04 19:41:53

标签: sql-server views database-schema access-rights

我有一个由db_owner

创建的表
CREATE TABLE [dbo].[TableTest](
[ID] [int] NULL,
[Cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]

另一个具有相同定义但在另一个自定义架构中的表。

CREATE TABLE [Test].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]

如果我创建这样的视图:

创建视图[测试]。[ViewTest]作为select * from dbo.TableTest

当我对新创建的视图进行选择时,我从Test.TableTest获取结果,而不是按预期从dbo.TableTest获取结果。 发生了什么事?

1 个答案:

答案 0 :(得分:0)

如果在创建Test.MyView之后更改基表的结构(例如:添加/删除列/删除并使用其他列[dbo].[TableTest]重新创建),则可能会发生这种情况。您必须使用sp_refreshview

CREATE TABLE [dbo].[TableTest](
[ID] [int] NULL,
[Cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

CREATE SCHEMA Test
GO

CREATE TABLE [Test].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

CREATE VIEW [Test].[ViewTest] as select * from dbo.TableTest
GO

SELECT * FROM [Test].[ViewTest] 
/*
ID          Cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO

DROP TABLE [dbo].[TableTest];
GO
CREATE TABLE [dbo].[TableTest](
[source] [int] NULL,
[cost] [int] NULL,
[partnumber] [int] NULL
) ON [PRIMARY]
GO

- 从这时起,Test.ViewTest应该包括source,cost和partnumber列 - 但是如果我们执行SELECT * FROM [Test]。[ViewTest] SQL Server将显示相同的“旧”列

SELECT * FROM [Test].[ViewTest] 
/*
ID          Cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO

- 解决方案:sp_refreshview

EXEC sp_refreshview 'Test.ViewTest'
GO
SELECT * FROM [Test].[ViewTest] 
/*
source      cost        partnumber
----------- ----------- -----------

(0 row(s) affected)
*/
GO