1. Trang chủ
  2. » Luận Văn - Báo Cáo

Nghiên cứu sử dụng trigger trên ngôn ngữ c để cập nhật gia tăng, đồng bộ các khung nhìn thực với phép nối ngoài cho postgresql

56 6 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Nội dung

TRƯỜNG ĐẠI HỌC SƯ PHẠM – ĐẠI HỌC ĐÀ NẴNG KHOA TIN HỌC BÁO CÁO KHÓA LUẬN TỐT NGHIỆP TÊN ĐỀ TÀI NGHIÊN CỨU SỬ DỤNG TRIGGER TRÊN NGÔN NGỮ C ĐỂ CẬP NHẬT GIA TĂNG, ĐỒNG BỘ CÁC KHUNG NHÌN THỰC VỚI PHÉP NỐI NGỒI CHO POSTGRESQL Sinh viên : Đỗ Minh Tuấn CBHD : TS Nguyễn Trần Quốc Vinh Lớp : 13 CNTT ĐÀ NẴNG, 05/2017 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL LỜI CẢM ƠN Lời đầu tiên, xin chân thành cảm ơn quý thầy cô khoa Tin học quý thầy cô giảng dạy công tác trường Đại học Sư phạm Đại học Đà Nẵng truyền đạt kiến thức quý báu cho năm học vừa qua Đặc biệt, xin cảm ơn TS Nguyễn Trần Quốc Vinh tận tình hướng dẫn, giúp đỡ động viên suốt thời gian thực đề tài Mặc dù cố gắng để hoàn thành dự án phạm vi cho phép khả năng, không tránh khỏi sai sót Vì vậy, tơi mong muốn nhận đóng góp ý kiến q giá từ thầy để hệ thống đề tài hoàn thiện Một lần xin chân thành cám ơn! Đà Nẵng, ngày 05 tháng 05 năm 2017 Sinh viên thực Đỗ Minh Tuấn Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL LỜI CAM ĐOAN Tôi xin cam đoan: Những nội dung báo cáo thực hướng dẫn trực tiếp TS Nguyễn Trần Quốc Vinh Mọi tham khảo dùng báo cáo trích dẫn rõ ràng tên tác giả, tên cơng trình, thời gian, địa điểm công bố Mọi chép không hợp lệ, vi phạm quy chế đào tạo, hay gian trá, xin chịu hoàn toàn trách nhiệm Sinh viên thực Đỗ Minh Tuấn Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL MỤC LỤC MỞ ĐẦU Lý chọn đề tài Mục tiêu nghiên cứu Nhiệm vụ nghiên cứu Đối tượng nghiên cứu Phạm vi nghiên cứu Phương pháp nghiên cứu Bố cục đề tài CHƯƠNG 1: CƠ SỞ LÝ THUYẾT 1.1 Ngơn ngữ lập trình C 1.1.1 Tổng quan ngơn ngữ lập trình C 1.1.2 Đặc điểm ngôn ngữ C 1.2 Trigger HQT CSDL 1.3 Trigger PostgreSQL 1.4 Hàm C 1.5 Hàm trigger C CHƯƠNG 2: KHUNG NHÌN THỰC TRONG POSTGRESQL VÀ THUẬT TOÁN CẬP NHẬT GIA TĂNG 2.1 Khung nhìn thực 2.2 PostgreSQL khung nhìn thực PostgreSQL 11 2.3 Các phương pháp cập nhật KNT 12 2.3.1 Phương pháp làm KNT 12 2.3.2 Phương pháp cập nhật gia tăng đồng 12 2.4 Một số vấn đề cần quan tâm CNGT KNT nối ngồi 13 2.5 Thuật tốn cập nhật gia tăng 14 2.5.1 Điều kiện triển khai thuật toán 14 Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL 2.5.2 Thuật tốn cập nhật gia tăng 15 2.5.2.1 Sự kiện thêm ghi Tiinsert vào bảng Ti 17 2.5.2.2 Sự kiện xóa ghi Tidelete từ bảng Ti 20 2.5.2.3 Sự kiện cập nhật ghi Tiupdate từ bảng Ti 21 2.6 Kết chương 21 CHƯƠNG 3: CHƯƠNG TRÌNH SINH TỰ ĐỘNG MÃ NGUỒN TRIGGER 23 3.1 Phần mã cứng trigger 23 3.2 Phần mã tùy biến trigger 24 3.3 Phân tích truy vấn 24 3.4 Khai báo biến 25 3.5 Xác định điều kiện sàng lọc liệu ban đầu 25 3.6 Chương trình sinh tự động mã nguồn 25 3.7 Một số ràng buộc sử dụng chương trình 27 3.8 Sử dụng kết chương trình sinh mã 28 3.9 Kết chương 30 KẾT LUẬN VÀ KIẾN NGHỊ 31 TÀI LIỆU THAM KHẢO 32 PHỤ LỤC 33 Mã nguồn trigger C sinh chương trình sinh mã tự động 33 Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL DANH MỤC VIẾT TẮT STT KÝ HIỆU ĐỊNH NGHĨA Khung nhìn thực (materialized view), khung nhìn có chức lưu trữ lại kết KNT thực thi truy vấn sở liệu, giúp phản hồi nhanh truy vấn việc đánh giá khả trả lời truy vấn dựa vào liệu lưu trữ khung nhìn thực TVG BG Truy vấn gốc, truy vấn dùng để tạo KNT Bảng gốc (base table), bảng tham gia vào mệnh đề FROM TVG Cập nhật gia tăng (incremental update), kỹ thuật cập nhật liệu KNT cách CNGT đồng bộ, thực liệu bảng gốc (BG) tham gia vào KNT có thay đổi CSDL Cơ sở liệu HQT CSDL Hệ quản trị sở liệu Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL DANH MỤC HÌNH VẼ Tên hình vẽ 2.1 2.2 Trang Cơ sở liệu quản lý đặt giao hàng hóa Mơ tả hoạt động HQT CSDL xuất truy vấn yêu cầu sử dụng liệu không sử dụng KNT 2.3 Cơ sở liệu quản lý đặt giao hàng hóa sử dụng 10 khung nhìn thực 2.4 Mơ tả q trình CNGT KNT trigger 13 2.5 Mơ tả q trình gộp nhóm bảng truy vấn nối ngồi Sơ đồ luồng mơ tả thuật tốn kiện insert Sơ đồ luồng mơ tả thuật tốn kiện delete Ví dụ liệu đầu vào 16 Giao diện chương trình sinh mã 27 Cấu trúc project biên dịch file mã nguồn 29 2.6 2.7 3.1 3.2 3.3 Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 19 22 26 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL MỞ ĐẦU Lý chọn đề tài Khung nhìn thực (KNT - Materialized Views) khung nhìn có chức lưu trữ lại kết thực thi truy vấn sở liệu Khung nhìn thực thường triển khai để phục vụ truy vấn yêu cầu lượng lớn phép nối bảng Nhờ có khung nhìn thực, ta phản hồi nhanh truy vấn việc đánh giá khả trả lời truy vấn dựa vào liệu lưu trữ khung nhìn thực thay phải truy vấn liên tục xử lý liệu từ bảng liên quan, qua cải thiện hiệu trình thực thi truy vấn Đặc biệt, truy vấn sử dụng với tần suất cao lượng liệu lớn, đồng thời thay đổi liệu bảng liên quan diễn với tần suất thấp, hiệu sử dụng KNT xem đạt tối đa Nhờ lợi ích mà mang lại, khung nhìn thực ứng dụng HQT CSDL thương mại tiếng Oracle, Microsoft SQL Server, IBM DB2, Các HQT CSDL mã nguồn mở MariaDB, MySQL PostgreSQL chưa hỗ trợ hỗ trợ chưa tốt khung nhìn thực Nghiên cứu khung nhìn thực nước nhận nhiều quan tâm, có nghiên cứu [1], [2] [3] Các nghiên cứu xây dựng chương trình sinh mã nguồn trigger tự động ngơn ngữ C, triển khai thuật toán cập nhật gia tăng PostgreSQL cho trường hợp truy vấn đầu vào bao gồm phép nối hỗ trợ hàm thống kê Tuy nhiên nghiên cứu chưa quan tâm đến khung nhìn thực tạo truy vấn lồng, truy vấn đệ quy, truy vấn bao gồm phép nối ngồi Có thể thấy truy vấn với phép nối (outer join) dạng truy vấn phổ biến, tần suất xuất cao, nhiên nghiên cứu cập nhật gia tăng khung nhìn thực cho PostgreSQL đến chưa hỗ trợ dạng truy vấn Vì vậy, tơi chọn đề tài Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL nghiên cứu sử dụng trigger viết ngôn ngữ C để cập nhật khung nhìn thực với phép nối ngồi PostgreSQL làm đề tài khóa luận tốt nghiệp Mục tiêu nghiên cứu - Xây dựng chương trình sinh tự động mã nguồn trigger ngơn ngữ C phục vụ cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL - Chương trình có khả sinh mã SQL cài đặt khung nhìn thực, trigger bảng gốc để cập nhật gia tăng, đồng khung nhìn thực Nhiệm vụ nghiên cứu - Tìm hiểu cách biên dịch sử dụng trigger viết ngôn ngữ C PostgreSQL - Khai thác thuật tốn CNGT KNT có để ứng dụng vào đề tài, đặc biệt thuật tốn CNGT KNT với phép nối ngồi Đối tượng nghiên cứu Khung nhìn thực PostgreSQL thuật tốn cập nhật gia tăng, đồng Phạm vi nghiên cứu Vấn đề cập nhật gia tăng, đồng khung nhìn thực sử dụng trigger viết ngôn ngữ C HQT CSDL PostgreSQL Phương pháp nghiên cứu - Nghiên cứu giáo trình, tài liệu CSDL quan hệ HQT CSDL quan hệ để hiểu chất đối tượng nghiên cứu như: khung nhìn, phép nối ngồi, trigger - Tham khảo cách thức viết trigger ngôn ngữ C cho PostgreSQL Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL Bố cục đề tài  Mở đầu Giới thiệu lý chọn đề tài, khách thể đối tượng nghiên cứu đề tài, giới hạn phạm vi nghiên cứu đề tài, nhiệm vụ phương pháp nghiên cứu đề tài  Chương 1: Cơ sở lý thuyết Nghiên cứu lý thuyết liên quan ngôn ngữ C, trigger HQT CSDL, đặc điểm hàm hàm trigger C  Chương 2: Khung nhìn thực PostgreSQL thuật tốn cập nhật gia tăng Trình bày lý thuyết khung nhìn thực, PostgreSQL khung nhìn thực PostgreSQL, phương pháp cập nhật khung nhìn thực PostgreSQL, vấn đề cần lưu ý cập nhật khung nhìn thực nối ngồi thuật tốn cập nhật gia tăng triển khai đề tài  Chương 3: Chương trình sinh tự động mã nguồn trigger Trình bày cấu trúc phần mã sinh ra, bước phân tích truy vấn, giới thiệu chương trình, cách sử dụng kết đầu chương trình  Kết luận kiến nghị Đánh giá kết đạt được, ưu nhược điểm đề tài, hướng phát triển kiến nghị có  Phụ lục Mã nguồn sinh chương trình Đỗ Minh Tuấn – 13CNTT (2013 – 2017) Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL str_ten_sv_sinh_vien = GET_FROM_CACHE(i, 5); str_que_quan_sinh_vien = GET_FROM_CACHE(i, 6); QUERY("INSERT INTO mv1 VALUES("); _QUERY(int_ma_khoa_khoa); _QUERY(","); _QUERY("'"); _QUERY(str_ten_khoa_khoa); _QUERY("'"); _QUERY(","); _QUERY_NULL_OR_VALUE(int_ma_lop_lop, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_lop_lop, "'"); _QUERY(","); _QUERY_NULL_OR_VALUE(int_ma_sv_sinh_vien, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_sv_sinh_vien, "'"); _QUERY(","); _QUERY_NULL_OR_VALUE(str_que_quan_sinh_vien, "'"); _QUERY(");"); EXECUTE_QUERY; } // end of FOR_EACH_SAVED_RESULT_ROW } /* Finish */ end_: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_insert, group_in_delete, group_out;"); EXECUTE_QUERY; END; } TRIGGER(pmvtg_mv1_delete_on_khoa) { // MV's data char *int_ma_khoa_khoa; // ma_khoa (khoa) char *str_ten_khoa_khoa; // ten_khoa (khoa) char *int_ma_lop_lop; // ma_lop (lop) char *str_ten_lop_lop; // ten_lop (lop) char *int_ma_sv_sinh_vien; // ma_sv (sinh_vien) char *str_ten_sv_sinh_vien; // ten_sv (sinh_vien) char *str_que_quan_sinh_vien; // que_quan (sinh_vien) char *mvcount; // count(*) () // Table's data int int_ma_khoa_khoa_table; char str_int_ma_khoa_khoa_table[20]; char * str_ten_khoa_khoa_table; BEGIN; // Get table's data Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 35 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL GET_INT32_ON_TRIGGERED_ROW(int_ma_khoa_khoa_table, 1); INT32_TO_STR(int_ma_khoa_khoa_table, str_int_ma_khoa_khoa_table); GET_STR_ON_TRIGGERED_ROW(str_ten_khoa_khoa_table, 2); // FCC if (1) { QUERY("CREATE TEMP TABLE group_in_delete AS( SELECT"); _QUERY(" khoa.ma_khoa, khoa.ten_khoa, lop.ma_lop, lop.ten_lop"); _QUERY(" FROM khoa LEFT OUTER JOIN lop ON khoa.ma_khoa = lop.ma_khoa "); _QUERY("WHERE true and khoa.ma_khoa = "); _QUERY(str_int_ma_khoa_khoa_table); _QUERY(" "); _QUERY(");"); _QUERY("CREATE TEMP TABLE group_out AS( SELECT"); _QUERY(" sinh_vien.ma_sv, sinh_vien.ten_sv, sinh_vien.que_quan, sinh_vien.ma_lop"); _QUERY(" FROM sinh_vien "); _QUERY(");"); _QUERY("CREATE TEMP TABLE mv_delete AS( SELECT"); _QUERY(" group_in_delete.ma_khoa, group_in_delete.ten_khoa, group_in_delete.ma_lop, group_in_delete.ten_lop, group_out.ma_sv, group_out.ten_sv, group_out.que_quan "); _QUERY(" "); _QUERY(" FROM group_in_delete LEFT OUTER JOIN group_out ON group_in_delete.ma_lop = group_out.ma_lop "); _QUERY("WHERE true and group_in_delete.ma_khoa = "); _QUERY(str_int_ma_khoa_khoa_table); _QUERY(" "); _QUERY(");"); _QUERY("SELECT * FROM mv_delete; "); EXECUTE_QUERY; if (NO_ROW) { goto end_; } DEFR(0); FOR_EACH_RESULT_ROW(i) { GET_STR_ON_RESULT(int_ma_khoa_khoa, i, 1); SAVE_TO_CACHE(int_ma_khoa_khoa); GET_STR_ON_RESULT(str_ten_khoa_khoa, i, 2); SAVE_TO_CACHE(str_ten_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(int_ma_lop_lop, i, 3); SAVE_TO_CACHE(int_ma_lop_lop); GET_NULLABLE_STR_ON_RESULT(str_ten_lop_lop, i, 4); SAVE_TO_CACHE(str_ten_lop_lop); GET_NULLABLE_STR_ON_RESULT(int_ma_sv_sinh_vien, i, 5); SAVE_TO_CACHE(int_ma_sv_sinh_vien); GET_NULLABLE_STR_ON_RESULT(str_ten_sv_sinh_vien, i, 6); SAVE_TO_CACHE(str_ten_sv_sinh_vien); GET_NULLABLE_STR_ON_RESULT(str_que_quan_sinh_vien, i, 7); SAVE_TO_CACHE(str_que_quan_sinh_vien); } FOR_EACH_SAVED_RESULT_ROW(i, 7) { int_ma_khoa_khoa = GET_FROM_CACHE(i, 0); Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 36 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL str_ten_khoa_khoa = GET_FROM_CACHE(i, 1); int_ma_lop_lop = GET_FROM_CACHE(i, 2); str_ten_lop_lop = GET_FROM_CACHE(i, 3); int_ma_sv_sinh_vien = GET_FROM_CACHE(i, 4); str_ten_sv_sinh_vien = GET_FROM_CACHE(i, 5); str_que_quan_sinh_vien = GET_FROM_CACHE(i, 6); QUERY("DELETE FROM mv1 WHERE TRUE "); _QUERY(" AND ma_khoa "); _QUERY("="); _QUERY(""); _QUERY(int_ma_khoa_khoa); _QUERY(""); _QUERY(" AND ten_khoa "); _QUERY("="); _QUERY("'"); _QUERY(str_ten_khoa_khoa); _QUERY("'"); _QUERY(" AND ma_lop "); _QUERY_ISNULL_OR_VALUE(int_ma_lop_lop, "", "="); _QUERY(" AND ten_lop "); _QUERY_ISNULL_OR_VALUE(str_ten_lop_lop, "'", "="); _QUERY(" AND ma_sv "); _QUERY_ISNULL_OR_VALUE(int_ma_sv_sinh_vien, "", "="); _QUERY(" AND ten_sv "); _QUERY_ISNULL_OR_VALUE(str_ten_sv_sinh_vien, "'", "="); _QUERY(" AND que_quan "); _QUERY_ISNULL_OR_VALUE(str_que_quan_sinh_vien, "'", "="); EXECUTE_QUERY; } // end of FOR_EACH_SAVED_RESULT_ROW } end_: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_delete, group_in_insert, group_out;"); EXECUTE_QUERY; END; } TRIGGER(pmvtg_mv1_update_on_khoa) { // MV's data char *int_ma_khoa_khoa; // ma_khoa (khoa) char *str_ten_khoa_khoa; // ten_khoa (khoa) char *int_ma_lop_lop; // ma_lop (lop) char *str_ten_lop_lop; // ten_lop (lop) char *int_ma_sv_sinh_vien; // ma_sv (sinh_vien) char *str_ten_sv_sinh_vien; // ten_sv (sinh_vien) char *str_que_quan_sinh_vien; // que_quan (sinh_vien) char *mvcount; // count(*) () // Table's data int int_ma_khoa_khoa_table; char str_int_ma_khoa_khoa_table[20]; char * str_ten_khoa_khoa_table; Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 37 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL BEGIN; if (UTRIGGER_FIRED_BEFORE) { // Get table's data GET_INT32_ON_TRIGGERED_ROW(int_ma_khoa_khoa_table, 1); INT32_TO_STR(int_ma_khoa_khoa_table, str_int_ma_khoa_khoa_table); GET_STR_ON_TRIGGERED_ROW(str_ten_khoa_khoa_table, 2); /* THỰC THI ĐOẠN MÃ CHO SỰ KIỆN DELETE */ } else if (!UTRIGGER_FIRED_BEFORE) { // Get table's data GET_INT32_ON_NEW_ROW(int_ma_khoa_khoa_table, 1); INT32_TO_STR(int_ma_khoa_khoa_table, str_int_ma_khoa_khoa_table); GET_STR_ON_NEW_ROW(str_ten_khoa_khoa_table, 2); /* THỰC THI ĐOẠN MÃ CHO SỰ KIỆN INSERT */ } /* Finish */ end_insert: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_insert, group_in_delete, group_out;"); EXECUTE_QUERY; END; } } Trigger sinh cho trường hợp thao tác liệu xảy bảng phụ bảng sinh viên: TRIGGER(pmvtg_mv1_insert_on_sinh_vien) { // MV's data char *int_ma_khoa_khoa; // ma_khoa (khoa) char *str_ten_khoa_khoa; // ten_khoa (khoa) char *int_ma_lop_lop; // ma_lop (lop) char *str_ten_lop_lop; // ten_lop (lop) char *int_ma_sv_sinh_vien; // ma_sv (sinh_vien) char *str_ten_sv_sinh_vien; // ten_sv (sinh_vien) char *str_que_quan_sinh_vien; // que_quan (sinh_vien) char *mvcount; // count(*) () // Table's data int int_ma_sv_sinh_vien_table; char str_int_ma_sv_sinh_vien_table[20]; int int_ma_lop_sinh_vien_table; char str_int_ma_lop_sinh_vien_table[20]; char * str_ten_sv_sinh_vien_table; char * str_que_quan_sinh_vien_table; BEGIN; Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 38 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL // Get table's data GET_INT32_ON_TRIGGERED_ROW(int_ma_sv_sinh_vien_table, 1); INT32_TO_STR(int_ma_sv_sinh_vien_table, str_int_ma_sv_sinh_vien_table); GET_INT32_ON_TRIGGERED_ROW(int_ma_lop_sinh_vien_table, 2); INT32_TO_STR(int_ma_lop_sinh_vien_table, str_int_ma_lop_sinh_vien_table); GET_STR_ON_TRIGGERED_ROW(str_ten_sv_sinh_vien_table, 3); GET_STR_ON_TRIGGERED_ROW(str_que_quan_sinh_vien_table, 4); // FCC if (1) { QUERY("CREATE TEMP TABLE group_in_insert AS( SELECT"); _QUERY(" sinh_vien.ma_sv, sinh_vien.ten_sv, sinh_vien.que_quan, sinh_vien.ma_lop"); _QUERY(" FROM sinh_vien "); _QUERY("WHERE true "); _QUERY(" and sinh_vien.ma_sv = "); _QUERY(str_int_ma_sv_sinh_vien_table); _QUERY(" "); _QUERY(");"); _QUERY("CREATE TEMP TABLE group_out AS( SELECT"); _QUERY(" khoa.ma_khoa, khoa.ten_khoa, lop.ma_lop, lop.ten_lop"); _QUERY(" FROM khoa LEFT OUTER JOIN lop ON khoa.ma_khoa = lop.ma_khoa "); _QUERY(");"); _QUERY("CREATE TEMP TABLE mv_insert AS( SELECT"); _QUERY(" group_out.ma_khoa, group_out.ten_khoa, group_out.ma_lop, group_out.ten_lop, group_in_insert.ma_sv, group_in_insert.ten_sv, group_in_insert.que_quan "); _QUERY(" "); _QUERY(" FROM group_out LEFT OUTER JOIN group_in_insert ON group_out.ma_lop = group_in_insert.ma_lop "); _QUERY("WHERE true "); _QUERY(" and group_in_insert.ma_sv = "); _QUERY(str_int_ma_sv_sinh_vien_table); _QUERY(" "); _QUERY(");"); _QUERY("CREATE TEMP TABLE mv_delete AS( SELECT DISTINCT "); _QUERY(" ma_khoa, ma_lop "); _QUERY(" FROM mv_insert WHERE "); _QUERY(" ma_khoa is not null "); _QUERY(" or ma_lop is not null "); _QUERY(");"); _QUERY("SELECT * FROM mv_insert; "); EXECUTE_QUERY; if (NO_ROW) { goto end_; } DEFR(7); FOR_EACH_RESULT_ROW(i) { GET_NULLABLE_STR_ON_RESULT(int_ma_khoa_khoa, i, 1); SAVE_TO_CACHE(int_ma_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(str_ten_khoa_khoa, i, 2); SAVE_TO_CACHE(str_ten_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(int_ma_lop_lop, i, 3); SAVE_TO_CACHE(int_ma_lop_lop); Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 39 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL GET_NULLABLE_STR_ON_RESULT(str_ten_lop_lop, i, 4); SAVE_TO_CACHE(str_ten_lop_lop); GET_STR_ON_RESULT(int_ma_sv_sinh_vien, i, 5); SAVE_TO_CACHE(int_ma_sv_sinh_vien); GET_STR_ON_RESULT(str_ten_sv_sinh_vien, i, 6); SAVE_TO_CACHE(str_ten_sv_sinh_vien); GET_STR_ON_RESULT(str_que_quan_sinh_vien, i, 7); SAVE_TO_CACHE(str_que_quan_sinh_vien); } FOR_EACH_SAVED_RESULT_ROW(i, 7) { int_ma_khoa_khoa = GET_FROM_CACHE(i, 0); str_ten_khoa_khoa = GET_FROM_CACHE(i, 1); int_ma_lop_lop = GET_FROM_CACHE(i, 2); str_ten_lop_lop = GET_FROM_CACHE(i, 3); int_ma_sv_sinh_vien = GET_FROM_CACHE(i, 4); str_ten_sv_sinh_vien = GET_FROM_CACHE(i, 5); str_que_quan_sinh_vien = GET_FROM_CACHE(i, 6); QUERY("INSERT INTO mv1 VALUES("); _QUERY_NULL_OR_VALUE(int_ma_khoa_khoa, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_khoa_khoa, "'"); _QUERY(","); _QUERY_NULL_OR_VALUE(int_ma_lop_lop, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_lop_lop, "'"); _QUERY(","); _QUERY(""); _QUERY(int_ma_sv_sinh_vien); _QUERY(""); _QUERY(","); _QUERY("'"); _QUERY(str_ten_sv_sinh_vien); _QUERY("'"); _QUERY(","); _QUERY("'"); _QUERY(str_que_quan_sinh_vien); _QUERY("'"); _QUERY(");"); EXECUTE_QUERY; } // end of FOR_EACH_SAVED_RESULT_ROW QUERY("SELECT * FROM mv_delete; "); EXECUTE_QUERY; DEFR(2); FOR_EACH_RESULT_ROW(i) { GET_NULLABLE_STR_ON_RESULT(int_ma_khoa_khoa, i, 1); SAVE_TO_CACHE(int_ma_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(int_ma_lop_lop, i, 2); SAVE_TO_CACHE(int_ma_lop_lop); Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 40 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL } FOR_EACH_SAVED_RESULT_ROW(i, 2) { int_ma_khoa_khoa = GET_FROM_CACHE(i, 0); int_ma_lop_lop = GET_FROM_CACHE(i, 1); QUERY("DELETE FROM mv1 WHERE true "); _QUERY(" and ma_khoa "); _QUERY_ISNULL_OR_VALUE(int_ma_khoa_khoa, "", "="); _QUERY(" and ma_lop "); _QUERY_ISNULL_OR_VALUE(int_ma_lop_lop, "", "="); _QUERY(" and ma_sv is null"); EXECUTE_QUERY; } } /* Finish */ end_: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_insert, group_in_delete, group_out;"); EXECUTE_QUERY; END; } TRIGGER(pmvtg_mv1_delete_on_sinh_vien) { // MV's data char *int_ma_khoa_khoa; // ma_khoa (khoa) char *str_ten_khoa_khoa; // ten_khoa (khoa) char *int_ma_lop_lop; // ma_lop (lop) char *str_ten_lop_lop; // ten_lop (lop) char *int_ma_sv_sinh_vien; // ma_sv (sinh_vien) char *str_ten_sv_sinh_vien; // ten_sv (sinh_vien) char *str_que_quan_sinh_vien; // que_quan (sinh_vien) char *mvcount; // count(*) () // Table's data int int_ma_sv_sinh_vien_table; char str_int_ma_sv_sinh_vien_table[20]; int int_ma_lop_sinh_vien_table; char str_int_ma_lop_sinh_vien_table[20]; char * str_ten_sv_sinh_vien_table; char * str_que_quan_sinh_vien_table; BEGIN; // Get table's data GET_INT32_ON_TRIGGERED_ROW(int_ma_sv_sinh_vien_table, 1); INT32_TO_STR(int_ma_sv_sinh_vien_table, str_int_ma_sv_sinh_vien_table); GET_INT32_ON_TRIGGERED_ROW(int_ma_lop_sinh_vien_table, 2); INT32_TO_STR(int_ma_lop_sinh_vien_table, str_int_ma_lop_sinh_vien_table); GET_STR_ON_TRIGGERED_ROW(str_ten_sv_sinh_vien_table, 3); GET_STR_ON_TRIGGERED_ROW(str_que_quan_sinh_vien_table, 4); Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 41 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL // FCC if (1) { QUERY("CREATE TEMP TABLE group_in_delete AS( SELECT"); _QUERY(" sinh_vien.ma_sv, sinh_vien.ten_sv, sinh_vien.que_quan, sinh_vien.ma_lop"); _QUERY(" FROM sinh_vien "); _QUERY("WHERE true "); _QUERY(" and sinh_vien.ma_sv = "); _QUERY(str_int_ma_sv_sinh_vien_table); _QUERY(" "); _QUERY(");"); _QUERY("CREATE TEMP TABLE group_out AS( SELECT"); _QUERY(" khoa.ma_khoa, khoa.ten_khoa, lop.ma_lop, lop.ten_lop"); _QUERY(" FROM khoa LEFT OUTER JOIN lop ON khoa.ma_khoa = lop.ma_khoa "); _QUERY(");"); _QUERY("CREATE TEMP TABLE mv_delete AS( SELECT"); _QUERY(" group_out.ma_khoa, group_out.ten_khoa, group_out.ma_lop, group_out.ten_lop, group_in_delete.ma_sv, group_in_delete.ten_sv, group_in_delete.que_quan "); _QUERY(" "); _QUERY(" FROM group_out LEFT OUTER JOIN group_in_delete ON group_out.ma_lop = group_in_delete.ma_lop "); _QUERY("WHERE true "); _QUERY(" and group_in_delete.ma_sv = "); _QUERY(str_int_ma_sv_sinh_vien_table); _QUERY(" "); _QUERY(");"); _QUERY("CREATE TEMP TABLE mv_insert AS( SELECT DISTINCT "); _QUERY(" ma_khoa, ten_khoa, ma_lop, ten_lop "); _QUERY(" FROM mv_delete WHERE "); _QUERY(" ma_khoa is not null "); _QUERY(" or ma_lop is not null "); _QUERY(");"); _QUERY("SELECT * FROM mv_delete; "); EXECUTE_QUERY; if (NO_ROW) { goto end_; } DEFR(2); FOR_EACH_RESULT_ROW(i) { GET_NULLABLE_STR_ON_RESULT(int_ma_khoa_khoa, i, 1); SAVE_TO_CACHE(int_ma_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(str_ten_khoa_khoa, i, 2); SAVE_TO_CACHE(str_ten_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(int_ma_lop_lop, i, 3); SAVE_TO_CACHE(int_ma_lop_lop); GET_NULLABLE_STR_ON_RESULT(str_ten_lop_lop, i, 4); SAVE_TO_CACHE(str_ten_lop_lop); GET_STR_ON_RESULT(int_ma_sv_sinh_vien, i, 5); SAVE_TO_CACHE(int_ma_sv_sinh_vien); GET_STR_ON_RESULT(str_ten_sv_sinh_vien, i, 6); SAVE_TO_CACHE(str_ten_sv_sinh_vien); GET_STR_ON_RESULT(str_que_quan_sinh_vien, i, 7); SAVE_TO_CACHE(str_que_quan_sinh_vien); } Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 42 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL FOR_EACH_SAVED_RESULT_ROW(i, 7) { int_ma_khoa_khoa = GET_FROM_CACHE(i, 0); str_ten_khoa_khoa = GET_FROM_CACHE(i, 1); int_ma_lop_lop = GET_FROM_CACHE(i, 2); str_ten_lop_lop = GET_FROM_CACHE(i, 3); int_ma_sv_sinh_vien = GET_FROM_CACHE(i, 4); str_ten_sv_sinh_vien = GET_FROM_CACHE(i, 5); str_que_quan_sinh_vien = GET_FROM_CACHE(i, 6); QUERY("DELETE FROM mv1 WHERE TRUE "); _QUERY(" AND ma_khoa "); _QUERY_ISNULL_OR_VALUE(int_ma_khoa_khoa, "", "="); _QUERY(" AND ten_khoa "); _QUERY_ISNULL_OR_VALUE(str_ten_khoa_khoa, "'", "="); _QUERY(" AND ma_lop "); _QUERY_ISNULL_OR_VALUE(int_ma_lop_lop, "", "="); _QUERY(" AND ten_lop "); _QUERY_ISNULL_OR_VALUE(str_ten_lop_lop, "'", "="); _QUERY(" AND ma_sv "); _QUERY("="); _QUERY(""); _QUERY(int_ma_sv_sinh_vien); _QUERY(""); _QUERY(" AND ten_sv "); _QUERY("="); _QUERY("'"); _QUERY(str_ten_sv_sinh_vien); _QUERY("'"); _QUERY(" AND que_quan "); _QUERY("="); _QUERY("'"); _QUERY(str_que_quan_sinh_vien); _QUERY("'"); EXECUTE_QUERY; } // end of FOR_EACH_SAVED_RESULT_ROW QUERY("SELECT * FROM mv_insert; "); EXECUTE_QUERY; DEFR(4); FOR_EACH_RESULT_ROW(i) { GET_NULLABLE_STR_ON_RESULT(int_ma_khoa_khoa, i, 1); SAVE_TO_CACHE(int_ma_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(str_ten_khoa_khoa, i, 2); SAVE_TO_CACHE(str_ten_khoa_khoa); GET_NULLABLE_STR_ON_RESULT(int_ma_lop_lop, i, 3); SAVE_TO_CACHE(int_ma_lop_lop); GET_NULLABLE_STR_ON_RESULT(str_ten_lop_lop, i, 4); SAVE_TO_CACHE(str_ten_lop_lop); } Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 43 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL FOR_EACH_SAVED_RESULT_ROW(i, 4) { int_ma_khoa_khoa = GET_FROM_CACHE(i, 0); str_ten_khoa_khoa = GET_FROM_CACHE(i, 1); int_ma_lop_lop = GET_FROM_CACHE(i, 2); str_ten_lop_lop = GET_FROM_CACHE(i, 3); QUERY("SELECT count(*) FROM mv1 WHERE true "); _QUERY(" AND ma_khoa "); _QUERY_ISNULL_OR_VALUE(int_ma_khoa_khoa, "", "="); _QUERY(" AND ma_lop "); _QUERY_ISNULL_OR_VALUE(int_ma_lop_lop, "", "="); _QUERY(" and ma_sv is NOT null"); EXECUTE_QUERY; GET_STR_ON_RESULT(mvcount, 0, 1); if (STR_EQUAL(mvcount, "0")) { QUERY("INSERT INTO mv1 VALUES("); _QUERY_NULL_OR_VALUE(int_ma_khoa_khoa, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_khoa_khoa, "'"); _QUERY(","); _QUERY_NULL_OR_VALUE(int_ma_lop_lop, ""); _QUERY(","); _QUERY_NULL_OR_VALUE(str_ten_lop_lop, "'"); _QUERY(","); _QUERY(" null "); _QUERY(","); _QUERY(" null "); _QUERY(","); _QUERY(" null "); _QUERY(");"); EXECUTE_QUERY; } } } end_: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_delete, group_in_insert, group_out;"); EXECUTE_QUERY; END; } TRIGGER(pmvtg_mv1_update_on_sinh_vien) { // MV's data char *int_ma_khoa_khoa; // ma_khoa (khoa) char *str_ten_khoa_khoa; // ten_khoa (khoa) char *int_ma_lop_lop; // ma_lop (lop) char *str_ten_lop_lop; // ten_lop (lop) char *int_ma_sv_sinh_vien; // ma_sv (sinh_vien) char *str_ten_sv_sinh_vien; // ten_sv (sinh_vien) char *str_que_quan_sinh_vien; // que_quan (sinh_vien) char *mvcount; // count(*) () // Table's data int int_ma_sv_sinh_vien_table; char str_int_ma_sv_sinh_vien_table[20]; Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 44 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL int int_ma_lop_sinh_vien_table; char str_int_ma_lop_sinh_vien_table[20]; char * str_ten_sv_sinh_vien_table; char * str_que_quan_sinh_vien_table; BEGIN; if (UTRIGGER_FIRED_BEFORE) { // Get table's data GET_INT32_ON_TRIGGERED_ROW(int_ma_sv_sinh_vien_table, 1); INT32_TO_STR(int_ma_sv_sinh_vien_table, str_int_ma_sv_sinh_vien_table); GET_INT32_ON_TRIGGERED_ROW(int_ma_lop_sinh_vien_table, 2); INT32_TO_STR(int_ma_lop_sinh_vien_table, str_int_ma_lop_sinh_vien_table); GET_STR_ON_TRIGGERED_ROW(str_ten_sv_sinh_vien_table, 3); GET_STR_ON_TRIGGERED_ROW(str_que_quan_sinh_vien_table, 4); /* THỰC THI LẠI ĐOẠN MÃ CHO SỰ KIỆN DELETE */ } else if (!UTRIGGER_FIRED_BEFORE) { // Get table's data GET_INT32_ON_NEW_ROW(int_ma_sv_sinh_vien_table, 1); INT32_TO_STR(int_ma_sv_sinh_vien_table, str_int_ma_sv_sinh_vien_table); GET_INT32_ON_NEW_ROW(int_ma_lop_sinh_vien_table, 2); INT32_TO_STR(int_ma_lop_sinh_vien_table, str_int_ma_lop_sinh_vien_table); GET_STR_ON_NEW_ROW(str_ten_sv_sinh_vien_table, 3); GET_STR_ON_NEW_ROW(str_que_quan_sinh_vien_table, 4); /* THỰC THI LẠI ĐOẠN MÃ CHO SỰ KIỆN INSERT */ } /* Finish */ end_insert: QUERY("DROP TABLE IF EXISTS mv_insert, mv_delete, group_in_insert, group_in_delete, group_out;"); EXECUTE_QUERY; END; } } Tệp script SQL tạo KNT cài đặt trigger: create table mv1 ( ma_khoa integer, ten_khoa character varying(30), ma_lop integer, ten_lop character varying(30), Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 45 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL ma_sv integer, ten_sv character varying(50), que_quan character varying(50) ); /* insert on khoa*/ create function pmvtg_mv1_insert_on_khoa() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_insert_on_khoa' language c strict; create trigger pgtg_mv1_insert_on_khoa after insert on khoa for each row execute procedure pmvtg_mv1_insert_on_khoa(); /* delete on khoa*/ create function pmvtg_mv1_delete_on_khoa() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_delete_on_khoa' language c strict; create trigger pgtg_mv1_before_delete_on_khoa before delete on khoa for each row execute procedure pmvtg_mv1_delete_on_khoa(); /* update on khoa*/ create function pmvtg_mv1_update_on_khoa() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_update_on_khoa' language c strict; create trigger pgtg_mv1_before_update_on_khoa before update on khoa for each row execute procedure pmvtg_mv1_update_on_khoa(); create trigger pgtg_mv1_after_update_on_khoa after update on khoa for each row execute procedure pmvtg_mv1_update_on_khoa(); /* insert on lop*/ create function pmvtg_mv1_insert_on_lop() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_insert_on_lop' language c strict; create trigger pgtg_mv1_insert_on_lop after insert on lop for each row execute procedure pmvtg_mv1_insert_on_lop(); /* delete on lop*/ create function pmvtg_mv1_delete_on_lop() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_delete_on_lop' language c strict; create trigger pgtg_mv1_before_delete_on_lop before delete on lop for each row execute procedure pmvtg_mv1_delete_on_lop(); /* update on lop*/ create function pmvtg_mv1_update_on_lop() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_update_on_lop' language c strict; create trigger pgtg_mv1_before_update_on_lop before update on lop for each row execute procedure pmvtg_mv1_update_on_lop(); create trigger pgtg_mv1_after_update_on_lop after update on lop for each row execute procedure pmvtg_mv1_update_on_lop(); /* insert on sinh_vien*/ create function pmvtg_mv1_insert_on_sinh_vien() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_insert_on_sinh_vien' language c strict; create trigger pgtg_mv1_insert_on_sinh_vien after insert on sinh_vien for each row execute procedure pmvtg_mv1_insert_on_sinh_vien(); /* delete on sinh_vien*/ Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 46 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL create function pmvtg_mv1_delete_on_sinh_vien() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_delete_on_sinh_vien' language c strict; create trigger pgtg_mv1_before_delete_on_sinh_vien before delete on sinh_vien for each row execute procedure pmvtg_mv1_delete_on_sinh_vien(); /* update on sinh_vien*/ create function pmvtg_mv1_update_on_sinh_vien() returns trigger as 'mv1_triggersrc', 'pmvtg_mv1_update_on_sinh_vien' language c strict; create trigger pgtg_mv1_before_update_on_sinh_vien before update on sinh_vien for each row execute procedure pmvtg_mv1_update_on_sinh_vien(); create trigger pgtg_mv1_after_update_on_sinh_vien after update on sinh_vien for each row execute procedure pmvtg_mv1_update_on_sinh_vien(); Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 47 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối ngồi cho PostgreSQL NHẬN XÉT CỦA CÁN BỘ HƯỚNG DẪN Đà Nẵng, ngày tháng năm 2017 Cán hướng dẫn Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 48 Sử dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn thực với phép nối cho PostgreSQL NHẬN XÉT CỦA HỘI ĐỒNG PHẢN BIỆN Đà Nẵng, ngày tháng năm 2017 Ký tên Đỗ Minh Tuấn – 13CNTT (2013 – 2017) 49 ... dụng trigger ngôn ngữ C cập nhật gia tăng, đồng khung nhìn th? ?c với phép nối ngồi cho PostgreSQL CHƯƠNG 2: KHUNG NHÌN TH? ?C TRONG POSTGRESQL VÀ THUẬT TỐN C? ??P NHẬT GIA TĂNG 2.1 Khung nhìn th? ?c Khung. .. tượng nghiên c? ??u Khung nhìn th? ?c PostgreSQL thuật toán c? ??p nhật gia tăng, đồng Phạm vi nghiên c? ??u Vấn đề c? ??p nhật gia tăng, đồng khung nhìn th? ?c sử dụng trigger viết ngơn ngữ C HQT CSDL PostgreSQL. .. nhật gia tăng, đồng khung nhìn th? ?c với phép nối ngồi cho PostgreSQL - Chương trình c? ? khả sinh mã SQL c? ?i đặt khung nhìn th? ?c, trigger bảng g? ?c để c? ??p nhật gia tăng, đồng khung nhìn th? ?c Nhiệm

Ngày đăng: 12/05/2021, 20:39

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN