有没有办法以一种触发的方式创建一个视图而不是一个表而不删除修改所述表,即:
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
提前致谢。
有没有办法以一种触发的方式创建一个视图而不是一个表而不删除修改所述表,即:
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
提前致谢。
你不应该需要那个。
如果您担心视图和基础表的差异,那么您应该模式绑定您的视图。这样,您的表就不能以与视图定义冲突的方式进行修改。此外,您不能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