而不是选择表?

时间:2013-10-29 11:24:55

标签: sql sql-server sql-server-2012 sql-view

在触发器方式中,有没有办法创建一个视图而不是一个表,而不会删除修改所述表,即:

create table t1(id int);
go
create table t2(id int);
go

create view tv as select id from t1 union all select id from t2;
go

现在做一些事情,如果我:

select * from t1;
go

我得到了输出:

select * from tv;
go

提前致谢。

1 个答案:

答案 0 :(得分:0)

你不应该那样。

如果您担心视图和基础表的差异,那么您应该对您的视图进行架构。这样,您的表就无法以与视图定义冲突的方式进行修改。此外,您不能在架构绑定视图中使用SELECT *

但是,如果你想玩自动视图刷新,这就是想法:

CREATE VIEW tv
AS 
SELECT * FROM dbo.t1 UNION ALL SELECT * FROM dbo.t2
GO

CREATE TRIGGER alterView
ON DATABASE 
FOR ALTER_TABLE
AS 
    EXEC sp_refreshview 'tv'
GO

ALTER TABLE dbo.t1 ADD txt nvarchar(18)
ALTER TABLE dbo.t2 ADD txt nvarchar(18)

但是,您会注意到,首先不可能进行更改,因为它会破坏视图的“相同数量的表达式”规则。

修改

我可能错过了这一点,因为我可能不理解这个问题。 如果要使用别名,可以使用SYNONYMS。如果与架构结合使用,您可以使用它们为视图添加别名:

CREATE SCHEMA TEST 
GO

CREATE SYNONYM TEST.t1 FOR dbo.tv
GO

SELECT * FROM TEST.t1
GO

如果您关注语法,您会注意到新的t1别名视图是以架构为前缀的。但是,如果使用过程对其进行换行,则可以松开前缀,并从别名视图中选择数据。

CREATE PROCEDURE TEST.TestProc
AS
    SELECT * FROM t1