在触发器方式中,有没有办法创建一个视图而不是一个表,而不会删除修改所述表,即:
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
提前致谢。
答案 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