Views, Stored Procedures
Views
1. Tạo view
CREATE VIEW v_Products
AS
SELECT
P.ProductId, P.ProductName, P.Price, P.CategoryId, P.SupplierId,
C.CategoryName, S.Name AS 'SupplierName'
FROM Products AS P
INNER JOIN Categories AS C ON P.CategoryId = C.Id
INNER JOIN Suppliers AS S ON P.SupplierId = D.Id
2. Sử dụng view
SELECT * FROM v_Products
3. Xóa view
DROP VIEW v_Products
4. Sửa view
ALTER VIEW v_Products
AS
SELECT
P.ProductId, P.ProductName, P.Price, P.CategoryId, P.SupplierId,
C.CategoryName, S.Name AS 'SupplierName'
FROM Products AS P
INNER JOIN Categories AS C ON P.CategoryId = C.Id
INNER JOIN Suppliers AS S ON P.SupplierId = D.Id
Các tùy chọn khi tạo view
WITH SCHEMABINDING
Với việc sử dụng WITH SCHEMABINDING, view sẽ được ràng buộc với các đối tượng khác trong cơ sở dữ liệu. Nếu bạn thực hiện thay đổi cấu trúc của các đối tượng được ràng buộc (như thay đổi tên cột, tên bảng, ...), bạn sẽ không thể thực hiện được.
CREATE VIEW v_Products
WITH SCHEMABINDING
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P
WITH ENCRYPTION
Với việc sử dụng WITH ENCRYPTION, mã nguồn của đối tượng sẽ được mã hóa và không thể đọc hoặc truy cập trực tiếp thông qua các công cụ SQL Server Management Studio (SSMS) hoặc các công cụ khác. Khi một đối tượng được mã hóa, SQL Server sẽ chỉ thực thi đối tượng đó mà không cung cấp truy cập vào mã nguồn.
CREATE VIEW v_Products
WITH ENCRYPTION
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P
WITH CHECK OPTION
WITH CHECK OPTION là một cấu hình được sử dụng trong câu lệnh CREATE VIEW để đảm bảo rằng các dòng dự liệu được chọn trong View cũng phải thỏa mãn điều kiện của View. Nếu bạn thêm hoặc cập nhật dữ liệu thông qua View, nó chỉ cho phép các thay đổi đáp ứng điều kiện của View.
CREATE VIEW v_Products
AS
SELECT
P.Id, P.Name, P.Price, P.Discount, P.CategoryId, P.SupplierId
FROM
Products AS P
WHERE
P.Price > 1000 -- Nếu không có điều kiện WHERE thì không thể INSERT, UPDATE, DELETE được
WITH CHECK OPTION
- Truy vấn dữ liệu từ view
SELECT * FROM v_Products
- Cập nhật dữ liệu thông qua view
UPDATE v_Products SET Price = 900 WHERE Id = 1
Lưu ý rằng nếu đơn giá mới được cập nhật không thỏa mãn điều kiện "Price > 1000", câu lệnh UPDATE sẽ không được chấp nhận.
Stored Procedures
1. Tạo stored procedure
CREATE PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT * FROM Orders WHERE CreatedDate BETWEEN @FromDate AND @ToDate
END
2. Sử dụng stored procedure
EXEC usp_GetOrders '2021-01-01', '2021-01-31'
-- hoặc
EXEC usp_GetOrders @FromDate = '2021-01-01', @ToDate = '2021-01-31'
3. Với OUTPUT parameters
CREATE PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME,
@Total INT OUTPUT
AS
BEGIN
SELECT @Total = COUNT(*) FROM Orders WHERE CreatedDate BETWEEN @FromDate AND @ToDate
END
DECLARE @Total INT
EXEC usp_GetOrders '2021-01-01', '2021-01-31', @Total OUTPUT
SELECT @Total
4. Xóa stored procedure
DROP PROCEDURE usp_GetOrders
5. Sửa stored procedure
ALTER PROCEDURE usp_GetOrders
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END
Các tùy chọn khi tạo stored procedure
WITH ENCRYPTION
Với việc sử dụng WITH ENCRYPTION, mã nguồn của đối tượng sẽ được mã hóa và không thể đọc hoặc truy cập trực tiếp thông qua các công cụ SQL Server Management Studio (SSMS) hoặc các công cụ khác. Khi một đối tượng được mã hóa, SQL Server sẽ chỉ thực thi đối tượng đó mà không cung cấp truy cập vào mã nguồn.
CREATE PROCEDURE usp_GetOrders
WITH ENCRYPTION
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END
WITH RECOMPILE
Với việc sử dụng WITH RECOMPILE, stored procedure sẽ được biên dịch lại mỗi khi thực thi. Điều này sẽ giúp tăng hiệu suất thực thi của stored procedure.
CREATE PROCEDURE usp_GetOrders
WITH RECOMPILE
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END
WITH EXECUTE AS
Với việc sử dụng WITH EXECUTE AS, stored procedure sẽ được thực thi với quyền của người dùng được chỉ định.
CREATE PROCEDURE usp_GetOrders
WITH EXECUTE AS 'dbo'
@FromDate DATETIME,
@ToDate DATETIME
AS
BEGIN
SELECT O.*, OD.ProductId, OD.Quantity, OD.Price, OD.Discount
FROM Orders AS O
INNER JOIN OrderDetails AS OD ON O.Id = OD.OrderId
WHERE O.CreatedDate BETWEEN @FromDate AND @ToDate
END