# 一、Designing and Implementing Views ## (一) What Is a View? 1. 建立 View 的當下,會存入當下的物件() 2. exec sp_refreshview 即可更新 View 的定義 ) ```=sql USE tempdb; DROP TABLE IF EXISTS t; CREATE TABLE t(c1 INT); GO CREATE VIEW vw AS SELECT * FROM t; GO ALTER TABLE t ADD c2 INT; SELECT * FROM vw; exec sp_refreshview 'vw' ``` 3. View 存語法不存資料 ## (二) Types of Views ### User-defined views: * Partitioned views https://dotblogs.com.tw/killysss/2012/09/11/74717 ### System views: ```=sql select * from sysprocesses select * from sys.dm_exec_sessions select * from sys.dm_exec_connections select * from sys.dm_exec_requests select * from sys.dm_tran_locks ``` ## (三) Advantages of Views 簡化 將複雜結構藏起來 架構 安全 重新命名列名 1. Create or Alter (2016開始提供) => view、sp、function # 二、Designing and Implementing Stored Procedures ## Lesson 4: Controlling Execution Context ### Controlling Executing Context ``` =sql Select HASHBYTES('SHA2_256','abraham') Select HASHBYTES('SHA2_256','rog') Select HASHBYTES('SHA2_256','engels') Select HASHBYTES('SHA2_256','light') ``` ``` =sql USE tempdb; DROP user u; CREATE user u WITHOUT LOGIN; CREATE OR ALTER PROC sp WITH EXEC AS 'u' AS SELECT user, SUSER_SNAME(); GO EXEC sp; ``` # 三、Designing and Implementing User-Defined Functions ``` =sql select fn1(col) from fn2() where fn3(col)= fn4(input) select top (10)* from t select * from t where c1 = 1 or c1 = -1 ``` ``` =sql CREATE TABLE dbo.t(c1 INT); CREATE FUNCTION fn ( @c1 INT ) RETURNS INT AS BEGIN RETURN @c1; END; GO SELECT dbo.fn(c1) FROM t; ``` ``` =sql create table t3(c1 nvarchar(10)) alter table t3 add c2 as substring(c1,2,1) -- Deterministic functions alter table t3 add c3 as rand() -- Nondeterministic create index idx on t3(c2) select * from t3 where substring(c1,2,1) = 'a' ``` ## Inline Table-Valued Functions ``` =sql CREATE OR ALTER FUNCTION fn3(@c1 INT) RETURNS TABLE AS RETURN SELECT * FROM t WHERE c1 > @c1; GO ``` ``` =sql DROP TABLE IF EXISTS t, t2; CREATE TABLE t(c1 INT); CREATE TABLE t2(c21 INT); GO CREATE OR ALTER VIEW vw AS SELECT * FROM t JOIN t2 ON t.c1 = t2.c21; GO INSERT INTO vw VALUES (1, 1); GO CREATE TRIGGER trg ON vw INSTEAD OF INSERT AS INSERT INTO t(c1) SELECT c1 FROM inserted; INSERT INTO t2(c21) SELECT c21 FROM inserted; GO SELECT * FROM t; SELECT * FROM t2; ``` row-level security role based security