You are on page 1of 20

HƯỚNG DẪN DÒ LỖI

I. Giới thiệu
Do có rất nhiều người, rất nhiều lần hỏi tôi cũng như các anh em phòng phần mềm
khác về vấn đề “Tại sao lại bị lỗi này?”, “Lỗi này là lỗi gì?” nên hôm nay tôi dành thời
gian để viết ra hướng dẫn này để anh chị em nếu có gặp vấn đề trên thì sẽ chủ động hơn
trong công việc.
Nói về lỗi thì có muôn vàn các lỗi thường gặp phải khi triển khai phần mềm, có
những lỗi liên quan đến thao tác dữ liệu, có những lỗi liên quan đến báo cáo, lỗi bệnh
nhân này gặp nhưng bệnh nhân khác lại không bị… Các lỗi này có thể do phần mềm chủ
động báo ra hoặc lỗi không lường trước được (lỗi continue). Trong hướng dẫn này tôi chỉ
đề cập đến vấn đề lỗi do phần mềm thông báo ra khi có lỗi ở phía cơ sở dữ liệu (SQL) và
hướng để dò lỗi sao cho thuận tiện nhất cho công việc, giúp giảm tải cho các bộ phận,
cũng như tránh gây ức chế không mong muốn cho bản thân, đồng nghiệp cũng như khách
hàng.
II. Cách xử lý
Phương pháp ở đây là dò mã nguồn theo từng trường hợp cụ thể đang gây nên lỗi,
mã chính là các thủ tục (store) trong SQL. Bằng cách sử dụng Profiler có sẵn trong phần
mềm (khó dùng, mất công sửa tham số từ “True”, “False” thành “1”, “0” để có thể chạy
được trong SQL Management Studio) hoặc sử dụng công cụ SQL Server Profiler có sẵn
trong SQL Management Studio (phiên bản Enterprise), hướng dẫn này sử dụng công cụ
SQL Server Profiler.
Nghe có vẻ phức tạp với một số người nghĩ rằng mình không có kiến thức về code
hay đơn giản là “Em chỉ học kế toán”, “Tôi mới học hết cấp 3”… Đừng bao giờ để những
suy nghĩ đó lấn át bạn, bởi vì trước đây các bạn học gì làm gì tôi cũng như công ty không
quan tâm. Còn hiện tại các bạn là nhân viên công ty Minh Lộ, công ty cung cấp công
nghệ, phần mềm phục vụ công tác quản lý bệnh viện cho nên có những kỹ năng các bạn
nên/phải học để phục vụ cho công việc của mình.
Quy trình bao gồm 3 bước (sẽ được nói rõ trong phần ví dụ) bao gồm:
- Thiết lập profiler để lấy ra được câu lệnh SQL đang bị lỗi.
- Thay các tham số lấy được từ câu lệnh vào store tương ứng để dò lỗi.
- Tìm ra lỗi và xử lý lỗi trên phần mềm (nếu có thể) hoặc báo lại phần mềm.
III. Ví dụ
Ví dụ gặp lỗi như sau:

Việc đầu tiên là phân tích xem lỗi này là lỗi gì (thay vì bốc máy gọi điện về cho
phần mềm kêu lỗi). Trong lỗi có cả Tiếng Việt lẫn Tiếng Anh, cái nào không hiểu thì có
thể dùng google dịch. Như ở đây có thể thấy rằng lỗi này là lỗi khi in tờ điều trị, tên thủ
tục là sprpttodieutri và thông tin gây lỗi là 1 dòng chữ Tiếng Anh. Có thể gõ vào google
dịch để biết nội dung đại khái của nó là:

Vậy nghĩa là việc chuyển đổi từ kiểu dữ liệu “datetime” sang kiểu “smalldatetime”
đang bị “trào” nên gây ra lỗi, câu lệnh bị dừng. Nghe có vẻ hơi code một tí rồi, nhưng có
thể lờ mờ hiểu là có lỗi gì đó liên quan đến kiểu dữ liệu ngày giờ và các bạn không cần
phải quan tâm datetime hay smalldatetime nó là cái gì cả, hãy tưởng tượng giống như
việc nhét 1 con voi vào cái tủ lạnh 100 lít vậy. Còn trên thực tế thì có một giá trị ngày này
đó nằm ngoài khoảng 01/01/1900-06/06/2079 vậy nên hi vọng sau khi đọc hướng dẫn
này thì sau này chỉ cần gặp lỗi liên quan đến datetime, smalldatetime, out-of-range thì các
bạn có thể đoán được ngay là nó bị cái gì mà không cần phải dịch.
Để biết được lỗi ở ngày nào, bảng nào, phiếu nào thì cần phải lấy tham số của câu
lệnh đang chạy ra đưa vào thủ tục để chạy trên SQL Management Studio.
1. Bước 1: Thiết lập profiler để lấy câu lệnh đang bị lỗi
Trong SQL Server Management Studio chọn vào Tool -> SQL Server Profiler

Sau khi SQL Server Profiler khởi động thì sẽ hiện lên cửa sổ đăng nhập, nhập
thông tin để đăng nhập. Chỉ cần máy có SQL thông với máy chủ là được, không cần nhất
thiết phải làm việc trên máy chủ.
Sau khi đăng nhập thì hiện lên cửa sổ thiết lập để bắt các sự kiện. Bỏ tích các tiêu
chí không cần thiết (mục đích tránh rối) chỉ chọn phần Store Procedures và TSQL và
tích vào cột TextData của tiêu chí Store Procedures.

Nhấn vào Column Filters… (1) để mở cửa sổ thiết lập để thiết lập điều kiện lọc
theo phần mềm đang cần kiểm tra. Mục đích để tránh có quá nhiều lệnh từ các phần mềm
chạy ở máy con gây rối, không biết là lệnh nào.
Để làm được việc này cần có PID (Process Identifier) của phần mềm đang chạy,
lấy được PID thông qua cửa sổ Task Manager, có sự khác biệt đôi chút đối với Windows
7 trở xuống (xem ở dưới). Đối với Windows 8, Windows Server 2008 trở lên Lấy PID
bằng cách chuột phải vào TaskBar chọn Task Manager, khi cửa sổ Task Manager hiện
lên mặc định ở tab Process chọn đến phần mềm đang chạy thường có tên là LrMain (1)
rồi nhấn chuột phải chọn Go to details (2)
Lúc này sẽ tự động chọn sang tab Details và chọn đến dòng có thông tin của phần
mềm, ta thấy được PID của phần mềm (1) trong trường hợp này là 21980. Lưu ý mỗi lần
phần mềm chạy thì sẽ có 1 số PID khác nhau.
Đối với Windows 7: thao tác cũng tương tự nhưng mặc định cột PID không hiển
thì nên phải thiết lập hiển thị lên.
Sau khi lấy được PID của phần mềm thì chọn đến ClientProcessID (1) sau đó
chọn Equals (2) và nhập PID lấy được ở bước trên vào sau đó nhấn Enter để xác nhận
nhập.

Đối với những trường hợp có báo ra tên thủ tục (store) như trường hợp này là
sprpttodieutri hoặc với kinh nghiệm, phán đoán thì có thể lọc theo nội dung câu lệnh
bằng cách chọn vào TextData sau đó nhập vào mục Like sau đó nhập vào tên thủ tục
hoặc các thông tin liên quan đến đến câu lệnh hiện tại, có thể là mã khám chữa bệnh..Lưu
ý phải có dấu % ở hai đâu của chuỗi và có thể lọc theo nhiều tiêu chí (nhấn enter sẽ sinh
ra 1 dòng mới). Sau khi thiết lập xong thì nhấn OK (3) rồi nhấn Run (4).
Lúc này sẽ hiện ra cửa sổ như hình, bây giờ mọi lệnh SQL thoả mãn điều kiện lọc
thiết lập ở trên sẽ được bắt lại và hiển thị ở đây.
Quay trở lại phần mềm thực hiện lại thao tác gây ra lỗi, ở ví dụ này là nhấn in tờ
điều trị và phần mềm sẽ báo ra lỗi như ở trên. Quay lại cửa sổ SQL Server Profiler sẽ
thấy được đoạn lệnh vừa thực thi trên phần mềm với các tiêu chí được thiết lập như thông
tin sự kiện thực thi EventClass (1), nội dung lệnh thực thi TextData (2). Nhấn vào dòng
tương ứng thì toàn bộ phần TextData sẽ hiển thị phía bên dưới (3), đây chính là câu lệnh
đang bị lỗi cần phải lấy ra để kiểm tra.
2. Bước 2: Thay các tham số lấy được từ câu lệnh vào store tương ứng để dò lỗi
Sau khi lấy được câu lệnh thực thi đang bị lỗi ở bước 1, mở SQL Management
Studio lên chọn vào dữ liệu tương ứng, mở một trang thực thi (New query) mới và dán
đoạn lệnh vào đó. Ở đây ta biết được tên thủ tục (store) do câu lệnh thường có dạng exec
[tên thủ tục] [danh sách tham số], ở đây là sprpttodieutri. Tiến hành lọc theo tên thủ
tục này bằng cách chọn mục Store Procedures (1) sau nhấn nút lọc (2) hoặc chuột phải
chọn Filter -> Filter Settings. Lúc này cửa sổ lọc sẽ hiện lên, nhập tên thủ tục vào ô
Value của dòng Name (3) sau đó nhấn Ok (4).

Lúc này mục Store Procedures sẽ lọc ra được thủ tục cần dò lỗi, chuột phải vào
tên thủ tục (1) chọn Modify (2) để mở nội dung thủ tục.
Sau khi thủ tục được mở lên, tiến hành chuyển thông tin thủ tục (store) này đoạn
lệnh chạy thường với mục đích có chỉnh sửa gì trên đó thì cũng không ảnh hưởng tới thủ
tục (store) ban đầu. Bước thực hiện bao gồm xoá toàn bộ phần thông tin từ đầu cho đến
cuối tên thủ tục (store) (1) và thay bằng DECLARE (2), xoá phần OUTPUT đối với các
thủ tục có tham số có phần này (1.1) thành (1.2), xoá phần thông tin AS BEGIN (3) sau
danh sách tham số thành (4), xoá END ở cuối cùng (5) thành (6).
QUAN TRỌNG: Dùng Ctrl + F để tìm kiếm xem trong thủ tục này có các
cụm từ INSERT INTO, UPDATE, DELETE gắn với các bảng mà không phải bảng
tạm hay không. Bảng tạm là các bảng bắt đầu bằng #, ## hoặc @. Nếu tồn tại đoạn
lệnh nào bao gồm các từ khoá ở trên gắn với bảng thường vui lòng dừng thực hiện
và xin ý kiến của phòng phần mềm.
Chuyển sang tab chứa thông tin câu lệnh lấy được từ Profiler (1) ở trên để thực
hiện hiệu chỉnh để chạy được với đoạn lệnh vừa chỉnh (2).

Mục đích ở đây là lấy thông tin tham số từ câu lệnh lấy được (1) thay vào đoạn
lệnh tạo ra sau khi chỉnh sửa từ thủ tục (store) (2) để chạy lệnh thuần. Có hai phương án
đó là sao chép từng tham số bên tab (1) sang tương ứng bên tab (2) hoặc hiệu chỉnh thông
tin tham số bên tab (1) để chạy được bên tab (2). Khuyến khích dùng phương án thứ 2 vì
đối với những thủ tục có nhiều tham số, ví dụ như trường hợp này thì việc sao chép mất
nhiều thời gian cũng như dễ gây nhầm lẫn (xem hình bên dưới).
Thay vào đó sử dụng phương án 2 ta sử dụng từ khoá SET để thực hiện gán giá trị
cho các tham số dạng SET [tham số] = [giá trị]. Câu lệnh lấy từ Profiler có dạng exec
[tên thủ tục] [danh sách tham số] nên ta xoá phần đầu đến tham số đầu tiên và thêm
SET vào (1) sau đó nhấn Ctrl+H để thực hiện thay thế chuỗi hàng loạt (cho nhanh).
Thay thế từ khoá đặc trưng ở đây là ,@ (2) thành ; SET @ (3) sau đó nhấn Replace All
(4) để thực hiện hiệu chỉnh.
Kết quả sau khi thực hiện ta sẽ có:

Sao chép đoạn chuỗi sau khi hiệu chỉnh này, nên xuống dòng để vừa dễ nhìn, vừa
tiện bỏ đi phần tham số không cần thiết phía sau đối với những câu lệnh có tham số trả ra
không cần thiết (trong trường hợp thủ tục có):
Sao chép sang thì đưa vào sau phần khai báo (1), lưu ý nếu với những câu lệnh nào
có đoạn lệnh đặt định dạng ngày (2) thì tất cả các tham số mà có giá trị kiểu ngày phải để
đúng định dạng (3). Đến đây là đã hoàn thành bước thứ 2.
3. Bước 3: Tìm ra lỗi và xử lý lỗi trên phần mềm (nếu có thể) hoặc báo lại phần mềm
Như đã nói ở trên, nếu dùng Ctrl+F tìm kiếm theo các cụm từ INSERT INTO
xxx, UPDATE [FROM] xxx, DELETE [FROM] xxx mà trong đó:
- [FROM] không nhất thiết phải có.
- xxx không bắt đầu bằng #, ##, @.
Thì vui lòng dừng lại và liên hệ với nhân viên phòng phần mềm. Nếu không gặp
phải trường hợp trên thì nhấn F5 để thực thi câu lệnh. Khi câu lệnh thực thi thì lúc này sẽ
có thông báo lỗi hiện ra (1).
Nhấn đúp chuột vào dòng báo lỗi đó (1) để SQL Management Studio trỏ đến dòng
phát sinh ra lỗi trong câu lệnh (2).
Ở đây có thể hiểu rằng khối lệnh bên dưới đang đổ dữ liệu vào bảng tạm
#DIENBIEN với một hay nhiều cột có giá trị ngày vượt ngoài khoảng cho phép (như đã
phân tích ở trên). Ta tiến hành “rào” (comment hay đơn giản là xoá đi) đoạn lệnh (1) lại
sau đó nhấn F5 để thực thi lại toàn bộ câu lệnh. Lúc này do đã rào câu lệnh (1) nên khối
lệnh bên dưới sẽ trả ra bảng dữ liệu, dễ dàng bằng mắt thường có thể thấy được có 1
phiếu diễn biến có ngày nằm ngoài khoảng (2). Thực hiện sửa lại thông tin phiếu và lặp
lại bước này cho đến khi không còn lỗi. Hoàn thành quá trình có thể tắt các cửa sổ này đi
như bình thường.

You might also like