You are on page 1of 14

I.

Truy vấn cơ sở dữ liệu:


II. Procedure:
https://quantrimang.com/procedure-thu-tuc-
trong-sql-server-159768
-Procedure (Thủ tục) là một chương trình trong cơ sở dữ liệu gồm nhiều
câu lệnh mà bạn lưu lại cho những lần sử dụng sau.

-Trong SQL Server, bạn có thể truyền các tham số vào procedure, tuy nó
không trả về một giá trị cụ thể như function (hàm) nhưng cho biết việc
thực thi thành công hay thất bại.

1. Tạo procedure:
https://docs.microsoft.com/en-us/sql/t-
sql/statements/create-procedure-transact-sql?view=sql-
server-ver15
Tạo một procedure trong SQL server, các thủ tục được lưu trữ tương tự
như các thủ tục trong các ngôn ngữ lập trình khác ở chỗ chúng có thể:

-Chấp nhận các tham số đầu vào và trả về nhiều giá trị ở dạng tham số
đầu ra cho thủ tục (không trả về một giá trị cụ thể như function).

-Chứa các câu lệnh lập trình thực hiện các hoạt động trong cơ sở dữ liệu,
bao gồm việc gọi các thủ tục khác.

- Trả lại giá trị trạng thái cho một thủ tục và cho biết thành công hay thất
bại (lý do thất bại).

* Đây là hai ví dụ: SELECT DB_NAME () AS ThisDB; trả về tên của cơ


sở dữ liệu hiện tại. Chúng ta có thể gói câu lệnh dó trong một thủ tục
được lưu trữ, vd:

CREATE PROC What_DB_is_this

AS

SELECT DB_NAME() AS ThisDB;

-Gọi thủ tục lưu trữ với câu lệnh: EXEC What_DB_is_this;
-Phức tạp hơn một chút là cung cấp một tham số đầu vào để làm cho quy
trình linh hoạt hơn.

CREATE PROC What_DB_is_that @ID INT

AS

SELECT DB_NAME(@ID) AS ThatDB;

Cung cấp số ID cơ sở dữ liệu khi bạn gọi thủ tục. VD: EXEC
What_DB_is_that 2; returns tempdb.

Syntaxsql: Cú pháp
-- Transact-SQL Syntax for Stored Procedures in SQL Server and Azure
SQL Database

CREATE [ OR ALTER ] { PROC | PROCEDURE }

[schema_name.] procedure_name [ ; number ]

[ { @parameter [ type_schema_name. ] data_type }

[ VARYING ] [ = default ] [ OUT | OUTPUT | [READONLY]

] [ ,...n ]

[ WITH <procedure_option> [ ,...n ] ]

[ FOR REPLICATION ]

AS { [ BEGIN ] sql_statement [;] [ ...n ] [ END ] }

[;]

<procedure_option> ::=

[ ENCRYPTION ]

[ RECOMPILE ]

[ EXECUTE AS Clause ]

Tham số:

 schema_name: Tên schema (lược đồ) sở hữu procedure.


- Các thủ tục bị ràng buộc bởi lược đồ. Nếu tên lược đồ không được chỉ định
khi thủ tục được tạo, lược đồ mặc định của người dùng đang tạo thủ tục sẽ tự
động được gán.

 procedure_name: Tên gán cho procedure.

- Tên thủ tục phải tuân thủ các quy tắc cho số nhận dạng và phải là duy nhất
trong lược đồ.
- Tránh sử dụng tiền tố sp_ khi đặt tên cho các thủ tục. tiền tố này được SQL
server sử dụng để chỉ định các thủ tục hệ thống. Việc sử dụng tiền tố có thể
khiến mã ứng dụng bị hỏng nếu có quy trình hệ thống trùng tên.
- Các thủ tục tạm thời cục bộ hoặc toàn cục có thể được tạo bằng cách sử dụng
một dấu(#) trước tên_thủ tục(#procedure_name) cho các thủ tục tạm thời cục
bộ và hai dấu hiệu số cho các thủ tục tạm thời toàn cục (##
procedure_name). Thủ tục tạm thời cục bộ chỉ hiển thị đối với kết nối đã tạo
ra nó và bị ngắt khi kết nối đó bị đóng. Một quy trình tạm thời toàn cầu có
sẵn cho tất cả các kết nối và được loại bỏ vào cuối phiên cuối cùng bằng
cách sử dụng quy trình. Tên tạm thời không thể được chỉ định cho các thủ
tục CLR.
- Tên đầy đủ của một thủ tục hoặc một thủ tục tạm thời toàn cục, bao gồm cả
##, không được vượt quá 128 ký tự. Tên hoàn chỉnh cho thủ tạm thời cục bộ,
bao gồm cả #, không được vượt quá 116 ký tự.

 @parameter: Một hay nhiều tham số được truyền vào hàm.

- Một tham số được khai báo trong thủ tục.


- Chỉ định tên tham số bằng cách sử dụng dấu tại (@) làm ký tự đầu tiên.
- Tên tham số phải tuân thủ các quy tắc cho số nhận dạng. Các tham số là cục
bộ của thủ tục; các tên tham số tương tự có thể được sử dụng trong các thủ
tục khác.
- Một hoặc nhiều tham số có thể được khai báo; tối đa là 2,100. Giá trị của
mỗi tham số được khai báo phải được cung cấp bởi người dùng khi thủ tục
được gọi trừ khi giá trị mặc định cho tham số được xác định hoặc giá trị
được đặt bằng tham số khác. Nếu một thủ tục chứa các tham số có giá trị
bảng và tham số bị thiếu trong lệnh gọi, một bảng trống sẽ được chuyển vào.
Các tham số chỉ có thể thay thế cho các biểu thức hằng; chúng không thể
được sử dụng thay thế cho tên bảng, tên cột hoặc tên của các đối tượng cơ sở
dữ liệu khác.
- Các tham số không thể được khai báo nếu (for reolication) được chỉ định.

 type_schema_name: Kiểu dữ liệu của schema (nếu có).


- [ type_schema_name.] data_type: Kiểu dữ liệu của tham số và lược đồ chứa
kiểu dữ liệu.
- Hướng dẫn thủ tục Transact-SQL: Tất cả các kiểu dữ liệu Transact-SQL có
thể được sử dụng làm tham số.
Bạn có thể sử dụng kiểu bảng do người dùng xác định để tạo các tham số có
giá trị bảng. Các tham số có giá trị bảng chỉ có thể là tham số INPUT và phải
đi kèm với từ khóa READONLY. Để biết thêm thông tin, hãy xem Sử dụng
Tham số Giá trị Bảng (Công cụ Cơ sở dữ liệu) kiểu dữ liệu con trỏ chỉ có thể
là tham số OUTPUT và phải đi kèm với từ khóa VARYING.
- Hướng dẫn thủ tục CLR:
Tất cả các kiểu dữ liệu SQL Server gốc có mã được quản lý tương đương có
thể được sử dụng làm tham số. Để biết thêm thông tin về sự tương ứng giữa
các kiểu CLR và kiểu dữ liệu hệ thống SQL Server, hãy xem Ánh xạ Dữ liệu
Tham số CLR. Để biết thêm thông tin về kiểu dữ liệu hệ thống SQL Server
và cú pháp của chúng, hãy xem Kiểu dữ liệu (Transact-SQL).
- Không thể sử dụng kiểu dữ liệu con trỏ hoặc giá trị bảng làm tham số.
- Nếu kiểu dữ liệu của tham số là kiểu do người dùng xác định CLR, bạn phải
có quyền THỰC HIỆN trên kiểu đó.
- VARYING Chỉ định tập hợp kết quả được hỗ trợ làm tham số đầu ra. Tham
số này được xây dựng động bởi thủ tục và nội dung của nó có thể khác nhau.
Chỉ áp dụng cho các tham số con trỏ. Tùy chọn này không hợp lệ cho các thủ
tục CLR.

 Datatype: Kiểu dữ liệu cho @parameter.

 Default: Giá trị mặc định gán cho @parameter. (giá trị mặc định cho một
tham số)

- Nếu một giá trị mặc định được xác định cho một tham số, thủ tục có thể
được thực thi mà không cần chỉ định giá trị cho tham số đó. Giá trị mặc định
phải là một hằng số hoặc nó có thể là NULL. Giá trị hằng số có thể ở dạng
ký tự đại diện, nên có thể sử dụng từ khóa LIKE khi truyền tham số vào thủ
tục.
- Giá trị mặc định được ghi lại trong cột sys.parameters.default chỉ dành cho
các thủ tục CLR. Cột đó là NULL cho các tham số thủ tục Transact-SQL.

 OUT/OUTPUT: @parameter là một tham số đầu ra.

- Sử dụng tham số OUTPUT để trả về giá trị cho trình gọi của thủ tục.
- Các tham số text, ntext và image không thể được sử dụng làm tham số
OUTPUT, trừ khi thủ tục là thủ tục CLR\
- Tham số đầu ra có thể là trình giữ chỗ con trỏ, trừ khi thủ tục là thủ tục CLR.
- Không thể chỉ định kiểu dữ liệu giá trị bảng làm tham số OUTPUT của một
thủ tục.

 READONLY: @parameter không thể bị procedure ghi đè lên.

- Chỉ ra rằng tham số không thể được cập nhật hoặc sửa đổi trong phần thân
của thủ tục. Nếu kiểu tham số là kiểu bảng-giá trị, thì phải chỉ định
READONLY.

 ENCRYPTION: Mã nguồn (source) của procedure sẽ không được lưu trữ


dưới dạng text trong hệ thống.

 RECOMPILE: Truy vấn sẽ không được lưu ở bộ nhớ đệm (cache) cho thủ
tục này.

- RECOMPILE Chỉ ra rằng Công cụ cơ sở dữ liệu không lưu vào bộ nhớ


cache một kế hoạch truy vấn cho thủ tục này, buộc nó phải được biên dịch
mỗi khi nó được thực thi.

 EXECUTE AS clause: Xác định ngữ cảnh bảo mật để thực thi thủ tục.

 FOR REPLICATION: Procedure đã lưu sẽ chỉ được thực thi trong quá trình
replication (nhân bản).

- Một thủ tục được tạo với tùy chọn FOR REPLICATION được sử dụng như
một bộ lọc thủ tục và chỉ được thực thi trong quá trình sao chép. Các tham số
không thể được khai báo nếu FOR REPLICATION được chỉ định. FOR
REPLICATION không thể được chỉ định cho các thủ tục CLR. Tùy chọn
RECOMPILE bị bỏ qua đối với các thủ tục được tạo với FOR
REPLICATION.
 {[BEGIN] sql_statement [;] [... n] [END]} Một hoặc nhiều câu lệnh
Transact-SQL bao gồm phần thân của thủ tục. Bạn có thể sử dụng các từ
khóa BEGIN và END tùy chọn để bao gồm các câu lệnh.

VD:

CREATE PROCEDURE spNhanvien

@nhanvien_name VARCHAR(50) OUT

AS

BEGIN

DECLARE @nhanvien_id INT;


SET @nhanvien_id = 8;

IF @nhanvien_id < 10

SET @nhanvien_name = 'Smith';

ELSE

SET @nhanvien_name = 'Lawrence';

END;

Thủ tục trên được gán tên là spNhanvien, có một tham số


là @nhanvien_name, output của tham số sẽ được dựa trên @nhanvien_id.

Sau đó, bạn có thể thực hiện tham chiếu spNhanvien như sau:

USE [test]

GO

DECLARE @site_name varchar(50);

EXEC FindSite @site_name OUT;

PRINT @site_name;

GO

2. Drop procedure (Xóa bỏ procedure)


https://docs.microsoft.com/en-us/sql/t-
sql/statements/drop-procedure-transact-sql?view=sql-
server-ver15
Cú pháp:
-Để xóa bỏ một procedure, ta có một cú pháp như sau:

-- Syntax for SQL Server and Azure SQL Database

DROP { PROC | PROCEDURE } [ IF EXISTS ] { [ schema_name. ]


procedure } [ ,...n ]

-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse

DROP { PROC | PROCEDURE } { [ schema_name. ] procedure_name }

Tranh luận

IF EXISTS Áp dụng cho: SQL Server (SQL Server 2016 (13.x) đến phiên bản
hiện tại). Chỉ bỏ quy trình có điều kiện nếu nó đã tồn tại.

- schema_name
Tên của lược đồ chứa thủ tục. Không thể chỉ định tên máy chủ hoặc tên cơ
sở dữ liệu.
- thủ tục
Tên của thủ tục được lưu trữ hoặc nhóm thủ tục được lưu trữ sẽ bị xóa. Các
thủ tục riêng lẻ trong một nhóm thủ tục được đánh số không thể bị loại bỏ;
toàn bộ nhóm thủ tục bị loại bỏ.
- Thực hành tốt nhất
Trước khi loại bỏ bất kỳ thủ tục đã lưu trữ nào, hãy kiểm tra các đối tượng
phụ thuộc và sửa đổi các đối tượng này cho phù hợp. Việc loại bỏ một thủ
tục được lưu trữ có thể khiến các đối tượng và tập lệnh phụ thuộc bị lỗi khi
các đối tượng này không được cập nhật. Để biết thêm thông tin, hãy xem
Xem sự phụ thuộc của một thủ tục được lưu trữ
- metadata
Để hiển thị danh sách các thủ tục hiện có, hãy truy vấn chế độ xem danh
mục sys.objects. Để hiển thị định nghĩa thủ tục, hãy truy vấn chế độ xem
danh mục sys.sql_modules.
- Bảo vệ (Security)
Quyền (Permissions)
Yêu cầu quyền CONTROL trên quy trình hoặc quyền ALTER trên lược đồ
chứa quy trình hoặc tư cách thành viên trong vai trò máy chủ cố định
db_ddladmin.
Ví dụ
Ví dụ sau loại bỏ thủ tục được lưu trữ dbo.uspMyProc trong cơ sở dữ liệu
hiện tại.
DROP PROCEDURE dbo.uspMyProc;
GO
Ví dụ sau đây loại bỏ một số thủ tục được lưu trữ trong cơ sở dữ liệu hiện
tại.
DROP PROCEDURE dbo.uspGetSalebyMonth, dbo.uspUpdateSalesQuotes,
dbo.uspGetSalesByYear;
Ví dụ sau loại bỏ thủ tục được lưu trữ dbo.uspMyProc nếu nó tồn tại nhưng
không gây ra lỗi nếu thủ tục không tồn tại. Cú pháp này là mới trong SQL
Server 2016 (13.x).
DROP PROCEDURE IF EXISTS dbo.uspMyProc;
GO
Procedure_name: Tên procedure bạn muốn xóa bỏ
- VD: DROP PROCEDURE spNhanvien;

III. Tối ưu cơ sở dữ liệu với procedure:


https://docs.microsoft.com/en-us/sql/relational-
databases/stored-procedures/stored-procedures-
database-engine?view=sql-server-ver15
- Việc tối ưu câu lệnh SQL sẽ làm tăng hiệu năng của ứng dụng, giảm thời
gian chờ đợi của người dùng cuối.
- Cơ sở dữ liệu là nơi lưu trữ dữ liệu.
- Những thao tác tới cơ sở dữ liệu gồm truy vấn (select), thêm (insert), sửa
(update), xoá (delete) dữ liệu. Khi dữ liệu nhỏ, tốc độ thực hiện gần như là
tức thì, khi dữ liệu đủ lớn thì tốc độ thực hiện trở thành một trở ngại đối với
dự án. Đôi khi bạn có thể mất hàng giờ để thực hiện một thao tác bất kỳ tới
cơ sở dữ liệu.
- Bài toán đặt ra lúc này là làm sao giảm thời gian thực hiện mà vẫn đáp ứng
được dữ liệu mong muốn. Mặc dù hiện nay có rất nhiều phương án để giải
quyết bài toán này như sử dụng cache, đưa dữ liệu lên RAM..

 Sử dụng store procedure (SP)

Đối với những thao tác được thực hiện thường xuyên và phức tạp, bạn nên sử
dụng SP để giảm lượng dữ liệu truyền đến máy chủ (thay vì bạn phải gửi câu
lệnh sql dài bạn chỉ cần gửi đi tên sp và danh sách tham số).

Thủ tục được lưu trữ trong SQL Server là một nhóm gồm một hoặc nhiều câu
lệnh Transact-SQL hoặc tham chiếu đến phương pháp ngôn ngữ thời gian chạy
chung (CLR) của Microsoft .NET Framework. Các thủ tục giống với các cấu
trúc trong các ngôn ngữ lập trình khác vì chúng có thể:

Chấp nhận các tham số đầu vào và trả về nhiều giá trị ở dạng tham số đầu ra cho
chương trình đang gọi.

Chứa các câu lệnh lập trình thực hiện các thao tác trong cơ sở dữ liệu. Chúng
bao gồm gọi các thủ tục khác.

Trả lại giá trị trạng thái cho một chương trình đang gọi để cho biết thành công
hay thất bại (và lý do thất bại).

Lợi ích của việc sử dụng các thủ tục được lưu trữ

Danh sách sau đây mô tả một số lợi ích của việc sử dụng các thủ tục.

- Giảm lưu lượng mạng máy chủ / máy khách

Các lệnh trong một thủ tục được thực thi dưới dạng một loạt mã. Điều này có
thể làm giảm đáng kể lưu lượng mạng giữa máy chủ và máy khách vì chỉ có
lệnh gọi thực thi thủ tục được gửi qua mạng. Nếu không có quy trình đóng gói
mã được cung cấp, mọi dòng mã riêng lẻ sẽ phải vượt qua mạng.

- Bảo mật mạnh mẽ hơn

Nhiều người dùng và chương trình khách có thể thực hiện các hoạt động trên
các đối tượng cơ sở dữ liệu cơ bản thông qua một thủ tục, ngay cả khi người
dùng và chương trình không có quyền trực tiếp trên các đối tượng cơ bản đó.
Thủ tục kiểm soát những quy trình và hoạt động nào được thực hiện và bảo vệ
các đối tượng cơ sở dữ liệu bên dưới. Điều này giúp loại bỏ yêu cầu cấp quyền
ở cấp đối tượng riêng lẻ và đơn giản hóa các lớp bảo mật.

Mệnh đề EXECUTE AS có thể được chỉ định trong câu lệnh CREATE
PROCEDURE để cho phép mạo danh người dùng khác hoặc cho phép người
dùng hoặc ứng dụng thực hiện các hoạt động cơ sở dữ liệu nhất định mà không
cần quyền trực tiếp trên các đối tượng và lệnh bên dưới.

EXECUTE AS Clause (Transact-SQL)

https://docs.microsoft.com/en-us/sql/t-sql/statements/execute-as-clause-
transact-sql?view=sql-server-ver15

Trong SQL Server, bạn có thể xác định ngữ cảnh thực thi của các mô-đun do
người dùng định nghĩa sau: các hàm (ngoại trừ các hàm có giá trị bảng nội
tuyến), thủ tục, hàng đợi và trình kích hoạt.

Bằng cách chỉ định ngữ cảnh mà mô-đun được thực thi, bạn có thể kiểm soát tài
khoản người dùng nào mà Công cụ cơ sở dữ liệu sử dụng để xác nhận quyền
trên các đối tượng được tham chiếu bởi mô-đun. Điều này cung cấp sự linh hoạt
và kiểm soát bổ sung trong việc quản lý các quyền trên chuỗi đối tượng tồn tại
giữa các mô-đun do người dùng xác định và các đối tượng được tham chiếu bởi
các mô-đun đó. Quyền chỉ phải được cấp cho người dùng trên chính mô-đun,
mà không cần phải cấp cho họ quyền rõ ràng trên các đối tượng được tham
chiếu. Chỉ người dùng mà mô-đun đang chạy phải có quyền đối với các đối
tượng được mô-đun truy cập.

Ví dụ: một số hành động như BẢNG TRUNCATE, không có quyền có thể cấp.
Để thực thi TRUNCATE TABLE, người dùng phải có quyền ALTER trên bảng
được chỉ định. Việc cấp cho người dùng ALTER quyền trên bảng có thể không
lý tưởng vì người dùng sẽ có các quyền hiệu quả vượt quá khả năng cắt bớt
bảng. Bằng cách kết hợp câu lệnh TRUNCATE TABLE trong một mô-đun và
chỉ định mô-đun đó thực thi với tư cách người dùng có quyền sửa đổi bảng, bạn
có thể mở rộng quyền cắt bớt bảng cho người dùng mà bạn cấp quyền THỰC
HIỆN trên mô-đun.

Khi gọi một thủ tục qua mạng, chỉ có lệnh gọi thực thi thủ tục mới hiển thị. Do
đó, người dùng độc hại không thể xem tên đối tượng bảng và cơ sở dữ liệu,
nhúng các câu lệnh Transact-SQL của riêng họ hoặc tìm kiếm dữ liệu quan
trọng.

Sử dụng các tham số thủ tục giúp bảo vệ chống lại các cuộc tấn công SQL
injection. Vì đầu vào tham số được coi là giá trị chữ và không phải là mã thực
thi, kẻ tấn công sẽ khó chèn lệnh vào (các) câu lệnh Transact-SQL bên trong thủ
tục và xâm phạm bảo mật.

Các thủ tục có thể được mã hóa, giúp làm xáo trộn mã nguồn. Để biết thêm
thông tin, hãy xem Mã hóa SQL Server.

- Sử dụng lại mã

Mã cho bất kỳ hoạt động cơ sở dữ liệu lặp lại nào là ứng cử viên hoàn hảo để
đóng gói trong các thủ tục. Điều này giúp loại bỏ việc viết lại không cần thiết
của cùng một mã, giảm sự không nhất quán của mã và cho phép mã được truy
cập và thực thi bởi bất kỳ người dùng hoặc ứng dụng nào có các quyền cần
thiết.

- Bảo trì dễ dàng hơn

Khi các ứng dụng khách gọi các thủ tục và giữ các thao tác cơ sở dữ liệu trong
tầng dữ liệu, chỉ các thủ tục phải được cập nhật cho bất kỳ thay đổi nào trong cơ
sở dữ liệu bên dưới. Tầng ứng dụng vẫn tách biệt và không phải biết về bất kỳ
thay đổi nào đối với bố cục, mối quan hệ hoặc quy trình cơ sở dữ liệu.
- Cải thiện hiệu suất

Theo mặc định, một thủ tục biên dịch lần đầu tiên nó được thực thi và tạo ra một
kế hoạch thực thi được sử dụng lại cho các lần thực thi tiếp theo. Vì bộ xử lý
truy vấn không phải tạo một kế hoạch mới, nên thường mất ít thời gian hơn để
xử lý thủ tục.

Nếu có sự thay đổi đáng kể đối với các bảng hoặc dữ liệu được quy trình tham
chiếu, kế hoạch được biên dịch trước thực sự có thể khiến quy trình thực hiện
chậm hơn. Trong trường hợp này, việc biên dịch lại quy trình và bắt buộc một
kế hoạch thực hiện mới có thể cải thiện hiệu suất.

Các loại thủ tục được lưu trữ

- Đã xác định người dùng

Thủ tục do người dùng xác định có thể được tạo trong cơ sở dữ liệu do người
dùng xác định hoặc trong tất cả cơ sở dữ liệu hệ thống ngoại trừ cơ sở dữ liệu
Tài nguyên. Quy trình có thể được phát triển trong Transact-SQL hoặc dưới
dạng tham chiếu đến phương pháp ngôn ngữ thời gian chạy thông dụng (CLR)
của Microsoft .NET Framework.

- Tạm thời

Thủ tục tạm thời là một dạng thủ tục do người dùng xác định. Các thủ tục tạm
thời giống như một thủ tục vĩnh viễn, ngoại trừ các thủ tục tạm thời được lưu trữ
trong tempdb. Có hai loại thủ tục tạm thời: cục bộ và toàn cầu. Chúng khác
nhau về tên, khả năng hiển thị và tính khả dụng của chúng. Các thủ tục tạm thời
địa phương có một dấu số duy nhất (#) là ký tự đầu tiên của tên chúng; chúng
chỉ hiển thị với kết nối người dùng hiện tại và chúng sẽ bị xóa khi kết nối bị
đóng. Các thủ tục tạm thời toàn cục có hai dấu hiệu số (##) là hai ký tự đầu tiên
của tên chúng; chúng được hiển thị cho bất kỳ người dùng nào sau khi chúng
được tạo và chúng sẽ bị xóa vào cuối phiên cuối cùng bằng cách sử dụng quy
trình.

- Hệ thống

Các thủ tục hệ thống được bao gồm trong SQL Server. Chúng được lưu trữ vật
lý trong cơ sở dữ liệu Tài nguyên ẩn, nội bộ và xuất hiện một cách hợp lý trong
lược đồ sys của mọi cơ sở dữ liệu do hệ thống và người dùng định nghĩa. Ngoài
ra, cơ sở dữ liệu msdb cũng chứa các thủ tục được lưu trữ hệ thống trong lược
đồ dbo được sử dụng để lập lịch cảnh báo và công việc. Bởi vì các thủ tục hệ
thống bắt đầu bằng tiền tố sp_, chúng tôi khuyên bạn không nên sử dụng tiền tố
này khi đặt tên cho các thủ tục do người dùng xác định. Để có danh sách đầy đủ
các thủ tục hệ thống, hãy xem Thủ tục lưu trữ hệ thống (Transact-SQL)

SQL Server hỗ trợ các thủ tục hệ thống cung cấp giao diện từ SQL Server đến
các chương trình bên ngoài cho các hoạt động bảo trì khác nhau. Các thủ tục mở
rộng này sử dụng tiền tố xp_. Để có danh sách đầy đủ các thủ tục mở rộng, hãy
xem Các thủ tục được lưu trữ mở rộng chung (Transact-SQL).

- Người dùng mở rộng xác định

Các thủ tục mở rộng cho phép tạo các quy trình bên ngoài bằng ngôn ngữ lập
trình như C. Các thủ tục này là các DLL mà một phiên bản của SQL Server có
thể tự động tải và chạy

IV. Sự khác nhau:

Procedure là một tập hợp các câu lệnh SQL dùng để thực thi một nhiệm vụ
nhất định. Nó có thể xem như một hàm trong các ngôn ngữ lập trình.

Trigger là một stored procedure được chạy tự động dựa trên những sự kiện mà
nó được đăng ký. Khi các sự kiện này xảy ra trong database, thì nó cũng sẽ được
thực thi. Ví dụ như một trigger có thể được gọi khi có một dòng dữ liệu được
thêm vào một table, hay một số cột trong bảng bị thay đổi.

TRIGGERS
PROCEDURES

Một Trigger sẽ thực thi tự động mỗi Một Procedure sẽ được thi khi khi
khi có các sự kiện INSERT, được gọi thông qua lệnh exec,
DELETE, UPDATE xảy ra trong một EXECUTE, hay đơn giản
table. procedure_name
Không thể gọi một trigger trong một Có thể gọi một procedure trong một
trigger khác. procedure khác.
Cú pháp: CREATE TRIGGER Cú pháp: CREATE PROCEDURE
TRIGGER_NAME PROCEDURE_NAME
Các mệnh đề trong transaction như Tất cả các mệnh đề trong transaction
COMMIT, ROLLBACK, như COMMIT, ROLLBACK,
SAVEPOINT đều không được sử SAVEPOINT đều được sử dụng trong
dụng trong trigger procedure.
Trigger được sử dụng để duy trì tính Procedure được dùng để thực thi các
toàn vẹn của dữ liệu bằng cách thực công việc cụ thể được người dùng
thi các mã lệnh trên các dòng dữ liệu định nghĩa.
mỗi khi xảy ra các hoạt động có thể
ảnh hưởng đến dữ liệu.
Trigger không có giá trị trả về cũng Hoạt động như một hàm, procedure
như các tham số đầu vào. có thể nhận các tham số và trả về các
kết quả.

https://www.geeksforgeeks.org/difference-between-trigger-and-procedure-in-
dbms/

You might also like