SQL SERVER视图
創建視圖
創建一個虛擬表,該表以另一種方式表示一個或多個表中的數據。CREATE VIEW 必須是查詢批處理中的第一條語句。
語法
CREATE VIEW [ < database_name > .] [ < owner > .] view_name [ ( column [ ,...n ] ) ]
[ WITH < view_attribute > [ ,...n ] ]
AS
select_statement
[ WITH CHECK OPTION ]
< view_attribute > ::=
??? { ENCRYPTION | SCHEMABINDING | VIEW_METADATA }
參數
view_name
是視圖的名稱。視圖名稱必須符合標識符規則。可以選擇是否指定視圖所有者名稱。
column
是視圖中的列名。只有在下列情況下,才必須命名 CREATE VIEW 中的列:當列是從算術表達式、函數或常量派生的,兩個或更多的列可能會具有相同的名稱(通常是因為聯接),視圖中的某列被賦予了不同于派生來源列的名稱。還可以在 SELECT 語句中指派列名。
如果未指定 column,則視圖列將獲得與 SELECT 語句中的列相同的名稱。
?
WITH CHECK OPTION
強制視圖上執行的所有數據修改語句都必須符合由 select_statement 設置的準則。通過視圖修改行時,WITH CHECK OPTION 可確保提交修改后,仍可通過視圖看到修改的數據。
WITH ENCRYPTION
表示 SQL Server 加密包含 CREATE VIEW 語句文本的系統表列。使用 WITH ENCRYPTION 可防止將視圖作為 SQL Server 復制的一部分發布。
?
示例. 使用 WITH CHECK OPTION
下例顯示名為 CAonly 的視圖,該視圖使得只對加利福尼亞州的作者應用數據修改。
USE pubs
IF EXISTS (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
????? WHERE TABLE_NAME = 'CAonly')
?? DROP VIEW CAonly
GO
CREATE VIEW CAonly
AS
SELECT au_lname, au_fname, city, state
FROM authors
WHERE state = 'CA'
WITH CHECK OPTION
GO
?
?
通過視圖向表中插入數據需要滿足的要求,視圖必須來源于一個表,一般行子集視圖都沒有問題(但是必須保護關鍵字段,如primary key ,not null的字段必須有,才可以進行更新)
如果是多表視圖,或者是列子集視圖(不滿足上面的要求),則可以使用instead of insert觸發器來實現
單個表通過視圖插入數據
1、首先創建表
CREATE TABLE [dbo].[TTotal](
?[年份] [nvarchar](50) NULL,
?[地區] [nvarchar](50) NULL,
?[數值類別] [nvarchar](50) NULL,
?[數值] [int] NULL
) ON [PRIMARY]
2、其次,創建視圖
create view VTotal
as
select * from TTotal
3、執行insert 語句
insert into VTotal values('2006','測試','1',1)
?
對于多個表的視圖,使用instead of insert 可以執行插入操作
instead of 觸發器的用法
INSTEAD OF 觸發器的主要優點是可以使不能更新的視圖支持更新。基于多個基表的視圖必須使用???
?????? INSTEAD OF 觸發器來支持引用多個表中數據的插入、更新和刪除操作。INSTEAD OF 觸發器的另一個優點是使您得以編寫這樣的邏輯代碼:在允許批處理的其他部分成功的同時拒絕批處理中的某些部分。
?
?????? Transact-SQL 語句創建兩個基表、一個視圖和視圖上的 INSTEAD OF 觸發器。以下表將個人數據和業務數據分開并且是視圖的基表。
/*在視圖上定義 instead of insert 觸發器以在一個或多個基表中插入數據。*/
--部門表
create table dept
(
??? d_id int primary key,
??? d_name varchar(20)
)
--員工表
create table emp
(
?? e_id int primary key,
?? e_name varchar(20),
?? d_id int references dept(d_id)
)
?
select * from emp
?
drop view v
create view v
as
select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id
?
select * from v
?
?
insert into v values(1001,'張珊',101,'銷售部')
?
/*******************使用instead of 觸發器******************/
drop trigger de_em_insert
go
create trigger de_em_insert
on v
instead of insert
as
begin
??? if (not exists (select d.d_id from dept d, inserted i where d.d_id = i.d_id))
???? insert into dept select d_id,d_name from inserted
?
?? if (not exists (select e.d_id from emp e, inserted i where e.d_id = i.d_id))
?? insert into emp select e_id,e_name,d_id from inserted
else
?? update emp set e_id = i.e_id,e_name = i.e_name from emp e, inserted i where e.d_id = i.d_id
end
可以在視圖或表中定義 INSTEAD OF DELETE 觸發器,以代替 DELETE 語句的標準操作。通常,在視圖上定義 INSTEAD OF DELETE 觸發器以便在一個或多個基表中修改數據。??
?????? 可在視圖上定義 INSTEAD OF UPDATE 觸發器以代替 UPDATE 語句的標準操作。通常,在視圖上定義 INSTEAD OF UPDATE 觸發器以便修改一個或多個基表中的數據。
總結
以上是生活随笔為你收集整理的SQL SERVER视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谈谈网站设计时图片的使用
- 下一篇: 飞鸽传书是怎么就变成飞秋了的?