Tối ưu hiệu năng SQL (phần 4): Trigger

 

Tối ưu hiệu năng SQL (phần 1): DATETIME

Tối ưu hiệu năng SQL (phần 2): DELETE

Tối ưu hiệu năng SQL (phần 3): Exists, IN và người thứ ba

Ngồi cạnh cái nồi cơm ấm áp trong mùa hè nóng bức này thật là khó chịu quá đi 😐 Tức cảnh sinh tình làm mình trào dâng những ý văn lai láng thế là đành ngồi vào bàn và viết luôn 1 bài mới trong series Tối ưu hiệu năng SQL.

Chủ đề được mang đến trong tuần này đó là trigger. Anh em chưa hiểu thì có thể google như mình

Cách để google trigger

Thực ra thì chủ đề về cái này thì nó chả tối ưu được tí hiệu năng nào cả, nhà nhà người người đều khuyến khích không nên sử dụng cái này :v Thế tại sao mình lại đưa vào trong đống bài viết về tối ưu vì 1 lý do rất đơn giản mà thôi. Đó chính là mình cóc biết nhét nó vào đâu trong đống bài viết như mớ bòng bong của mình cả =)) Nổi hứng thì viết thôi :3

3_zingvn

Chẳng qua là tuần vừa rồi bên mình có dính cái phải sử dụng Trigger. Mình thì biết là dùng cháu này nó chẳng nhanh nhẹn gì rồi ai ngờ còn phải dùng cho tất cả các bản trong CSDL :v ghét của nào trời trao của đấy 😦

truyen-tranh-doremon-che-54-2014-03-31

Mục đích của mình trong bài này chủ yếu là để chia sẻ 1 cách dùng Trigger để lưu lại toàn bộ sự thay đổi của trong CSDL.

Ý tưởng là mỗi khi có inserted, update hay deleted được thực hiện trên một dòng ở bảng trong CSDL thì chúng ta sẽ lưu thông tin đó vào 1 bảng Log. Trong bảng Log đó sẽ lưu lại thông tin là bảng nào được thay đổi này, khóa chính của bảng đó là gì, giá trị của khóa chính, thay đổi là insert, update hay delete và bla bla tùy bạn :v

Ý tưởn nghe vẻ cũng đơn giản nhỉ :)) Nếu như vây thì ta sẽ phải thực hiện là tạo ra 1 đống trigger trên tất cả các bảng. WTF cái gì tất cả các bảng á 😐 Tận 500 bảng thì tạo thế nào được 😦 Ngồi làm tay thế thì chết à 😦 Chính vì vậy mình xin chia sẻ 1 script dùng để tư động tạo trigger cho tất cả các bảng trong DB. Anh em dùng chỉ cầ F5 là đụ….

Anh em đặc biệt lưu ý là dùng thằng này thì trong bảng phải có khóa chính. Nếu không có khóa chính thì các bảng đó thay đổi ở row nào mình không thể biết được nên script kia sẽ lỗi không chạy được

Thôi tiện thể chia sẻ luôn script tự động tạo khóa chính tự tăng cho anh em dùng luôn. Script tự đông kiểm tra bảng nào chưa có khóa chính thì sẽ thêm. Vì là them trường tự tăng nên nếu trong bảng có trường tự tăng rồi thì sẽ tự set trường đó thành khóa chính.

Tham khảo

https://www.simple-talk.com/sql/database-administration/pop-rivetts-sql-server-faq-no.5-pop-on-the-audit-trail/

http://stackoverflow.com/questions/19737723/log-record-changes-in-sql-server-in-an-audit-table

Advertisements

10 thoughts on “Tối ưu hiệu năng SQL (phần 4): Trigger

  1. Anh cho Em hỏi nếu mình dùng trigger để lưu log thế này thì có bị vấn đề gi giảm performance của hệ thống không vậy. Tại mỗi lân user có hành động thêm, xóa ,sửa gi thi đều gọi đên triigger này

    Liked by 1 person

    • dùng trigger rất nguy hiểm nhé bạn. Tốt nhất bạn nên xử lý trên code. Hạn chế dùng trigger vì perforamnce kém. ngoài ra nếu dùng trigger thì khi lỗi cả câu lệnh của bạn coi như cũng hỏng luôn

      Like

  2. Pingback: Tối ưu SQL (phần 9): tính tổng các dòng | Code, code and more code

  3. Pingback: Tối ưu SQL phần 8: 1 câu chuyện đơn gian về việc cộng chuỗi | Code, code and more code

  4. Pingback: Tối ưu SQL (phần 7): Chuyện ngắn của ID | Code, code and more code

  5. Pingback: Tối ưu hiệu năng SQL (phần ): Update hay Merge? | Code, code and more code

  6. stupid question: cho mình hỏi là khi nào cần dùng log này vậy bạn. dự án mình chưa bao giờ xài cái này

    Like

    • đợt này bên mình có việc gấp cần chuyển csdl từ sql sang oracle mà đòi có 2 3 hôm nên giải pháp tạm thời là có cái lưu thay đổi của sql rồi mình viết tool dựa vào bảng log đó để lấy dữ liệu chuyển qua oracle. Source code mình sẽ public trong bài viết tới :p

      Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s