sơ lược về SQL YENHH

16 87 0
sơ lược về SQL  YENHH

Đ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

Bài 12: Các vấn đề sở liệu 12.1 Cách tổ chức liệu - Hệ thống database chia làm phần: o Database Sys:  Lưu thông tin công ty  Lưu thông tin người sử dụng  Lệnh đơn (menu)  Quyền truy cập, giới hạn  Thông tin chứng từ Điểm khác với FB khơng lưu thơng tin giao diện, ngôn ngữ, tác giả…: vd bảng không dùng: about, brow, dir, freecodeinfo, freedirdinfo, freefieldinfo, grid, lookup, message, repinfo, reports, … o Database App: Chứa liệu ứng dụng - Một chứng từ thông thường có bảng để lưu trữ (master detail), nhược điểm cách lưu trữ theo thời gian lượng liệu bảng lớn, dẫn đến tốc độ truy cập lúc chậm, bảng phân theo kỳ để lưu trữ (hiện chứng từ FBO vào trường ngay_ct để phân đoạn) kèm theo bảng khác để phục vụ vấn đề tốc độ: o mxx$yyyymm: bảng chứa thơng tin phần master (vd hóa đơn bán hàng: m81$000000, m81$201301 , m81$201302…) o dxx$yyyymm: bảng chứa thông tin phần chi tiết (vd d81$000000, d81$201301, d81$201302…) o cxx$000000: bảng dùng để truy xuất chung cho tất bảng phân kỳ khác, bảng khơng có phân kỳ Bảng có cấu trúc giống cho tất chứng từ (Cấu trúc bảng: stt_rec, ngay_ct, so_ct, ma_dvcs, status, user_id0) o ixx$yyyymm: bảng dùng để chứa chuỗi tìm kiếm cho chứng từ Bảng có cấu trúc giống cho tất chứng từ (Các trường giống bảng c, thêm trường c$, m$, d$) Lưu ý: Các bảng có phần $000000 bảng cấu trúc chung, bảng lại bảng chứa liệu Việc lưu trữ vào bảng thư viện FBO tự động làm không dùng đến kỹ thuật phân đoạn theo bảng (Partition Table) SQL có phiên Enterprice, SQL 2005 trở lên Việc đặt tên bảng khác ký hiệu m, d, c, i 12.2 Một số bảng liệu tổng hợp, trung gian Ngoài bảng chứng từ phân kỳ (trừ phdm, phlsx, dmts, dmcc…) có số bảng khác phân kỳ trình bày bên - Một số bảng tổng hợp (post nhập liệu): o r00$000000, r00$yyyymm (~ ct00): bảng chứa tất định khoản phát sinh kế toán o r70$000000, r70$yyyymm (~ ct70): bảng chứa tất phát sinh liên quan đến tồn kho theo hóa đơn o r90$000000, r90$yyyymm (~ ct90): bảng chứa tất phát sinh liên quan đến tồn kho theo thực tế o r20$000000, r20$yyyymm (~ ctgt20): bảng chứa phát sinh liên quan đến thuế đầu o r30$000000, r30$yyyymm (~ ctgt30): bảng chứa phát sinh liên quan đến thuế đầu vào o r50$000000, r50$yyyymm (~ ctcp20): bảng chứa phát sinh liên quan đến thuế đầu o r60$000000, r60$yyyymm (~ ctcp30): bảng chứa phát sinh liên quan đến thuế đầu vào - Ngoài bảng cân đối theo năm có thêm bảng cân đối theo kỳ phát sinh theo kỳ: o cdkh$yyyymm: cân đối khách hàng o pskh$yyyymm: phát sinh khách hàng o cdtk$yyyymm: cân đối tài khoản o pstk$yyyymm: phát sinh tài khoản o pstkdu$yyyymm: phát sinh tài khoản đối ứng - Các bảng tính theo kỳ thuế TNCN: o t00$yyyymm: Bảng phân đoạn theo tháng: Bảng tổng hợp tất phát sinh thuế TNCN o t01$yyyy: Bảng phân đoạn theo năm: lưu phát sinh TNCN năm theo loại thu nhập nhân viên o t02$yyyy: Bảng phân đoạn theo năm: lưu thu nhập lũy tiến tiền thuế tính theo lũy tiến o t03$yyyy: Bảng lưu thơng tin tổng hợp năm từ bảng t02 theo đvcs mã nhân viên Bảng chứa tất giá trị cần thiết cho toàn báo cáo thuế TNCN Báo cáo khơng phải tính tốn lặp lại nhiều lần - Các bảng phân đoạn lưu file vật lý (*.mdf) file vật lý khác (*.ndf) lưu ổ cứng khác o Đối với khách hàng thơng thường, lưu bảng file vật lý khác o Đối với khách hàng có liệu lớn số người truy cập nhiều, chia file đặt file ổ cứng khác nhau; Ví dụ file để nhập liệu chứng từ ổ cứng riêng; file để lên báo cáo (ct00, ct70…) ổ cứng riêng => truy xuất nhiều đến báo cáo khơng ảnh hưởng đến tốc độ nhiều người nhập liệu ngược lại - Ưu điểm: o Các cluster noncluster index thiết lập file nên khả truy xuất nhanh so với tính tách bảng Enterprise (các index lưu vào Primary, có liệu lưu sang Partition riêng) o Không phụ thuộc vào thời gian sử dụng chương trình - Giới thiệu chức “Tạo năm” (tạo file theo kỳ, bảng sysgendata, options): o Gen bảng theo kỳ: UPDATE options SET val ='1'WHERE name ='M_USE_SYSTEM_FUNCTION' GO EXEC FastBusiness$App$Dynamic$GenData @year1, @year2, 1, Store vào khai báo bảng sysgendata để tạo bảng o Gen cụ thể bảng FastBusiness$App$Dynamic$AddTable@cBaseTable,@cPrimeTable, @cRefPrimeTable, @cPrimeFileGroup,@Type,@dFrom,@dTo, @nExecute Bang goc de gen (d81$000000) Ky tu dau bang can tao (d81$) Ky tu dau bang Reference Foreign Key neu co (không dùng) Luu vao PRIMARY hoac FileGroup da co - Theo thang, - Theo nam Vi du tao bang cho nam 2010: 20100101 Vi du tao bang cho nam 2010: 20101231 - Excute, – No FastBusiness$App$Dynamic$AddTable 'd81$000000','d81$','','Voucher', 1, 2013, 2015, 12.3 Một số thủ tục, hàm thường dùng - Lưu ý: o Mã: sử dụng VARCHAR(33) o Tên: sử dụng NVARCHAR(511) o Chuỗi: sử dụng NVARCHAR(1023) o Khi viết store, tham biến truyền vào hạn chế viết tắt, thông thường truyền số biến cố định: @Language CHAR(1), @UserID INT, @Admin BIT - Tên hàm/thủ tục dùng chung: o Một số cũ lấy từ FB không đổi tên: ff_inlist, ff_getUpdateOrder… o Một số đặt tên là: FastBusiness$ - Lấy liệu từ bảng phân kỳ: FastBusiness$Partition$Execute@ExecuteScript,@Unit,@DateField,@DateFr om,@DateTo,@UserID,@Admin,@Execute FastBusiness$Partition$Execute'select * from m81$ %Partition',NULL,NULL,'20120101','20131231', 1, 1, Có thể dùng hàm cho xử lý mở rộng khác thêm trường tạo thêm index cho bảng: FastBusiness$Partition$Execute@ExecuteScript,@Unit,@DateField,@DateFr om,@DateTo,@UserID,@Admin,@Execute FastBusiness$Partition$Execute'ALTER TABLE m99$%Partition ADD cot_moi VARCHAR(16)',NULL,NULL,'20120101','20131231', 1, 1, - Lấy liệu chi tiết từ bảng r00$yyyymm: sử dụng hình browse có xem chi tiết: FastBusiness$Report$GLDetail @Refresh BIT, @PageIndex INT, @PageCount INT, @LastPage INT, @LastCount INT, @FirstItem VARCHAR(128), @LastItem VARCHAR(128), @SelectClause NVARCHAR(4000), @JoinClause NVARCHAR(4000), @WhereClause NVARCHAR(4000), @DateFrom SMALLDATETIME, @DateTo SMALLDATETIME, @Unit VARCHAR(1024), @Admin BIT, @UserID INT - Lấy liệu chi tiết từ bảng r70$yyyymm/r90$yyyymm: FastBusiness$Report$StockDetail@Refresh BIT, @PageIndex INT, @PageCount INT, @LastPage INT, @LastCount INT, @FirstItem VARCHAR(128), @LastItem VARCHAR(128), @SelectClause NVARCHAR(4000), @JoinClause NVARCHAR(4000), @WhereClause NVARCHAR(4000), @DateFrom SMALLDATETIME, @DateTo SMALLDATETIME, @Unit VARCHAR(1024), @DataType TINYINT, Dữ liệu theo hóa đơn (#1) hay theo thực tế (=1) @Admin BIT, @UserID INT - Lấy chuỗi điều kiện kiểm tra phân quyền theo mã đơn vị sở SET @UnitKey dbo.FastBusiness$Function$System$GetUnitFilter('ma_dvcs', = @Unit, @UserID, @Admin) - Sử dụng hàm chuẩn lấy số dư đầu kỳ/cuối kỳ: Dùng chung hàm cho đầu kỳ/cuối kỳ, cho nhiều đối tượng Sử dụng stored thay cho function FastBusiness$Balance$ - - FastBusiness$Balance$Account: - FastBusiness$Balance$AccountUnit - FastBusiness$Balance$Bcontract - FastBusiness$Balance$Contract - FastBusiness$Balance$Customer - FastBusiness$Balance$CustomerUnit - FastBusiness$Balance$DCAccount - FastBusiness$Balance$Investment - FastBusiness$Balance$Item - FastBusiness$Balance$Job - FastBusiness$Balance$JobCustomer - FastBusiness$Balance$Location - FastBusiness$Balance$Lot Hàm lấy điều kiện lọc theo tài khoản: FastBusiness$Function$System$GetAccountFilter - Gồm toán tử: =, like, inlist, notinlist, exactinlist - Kiểm tra chuỗi vượt giới hạn cho phép SET @Key = dbo.FastBusiness$Function$System$GetCheckKey(@Key) Trường hợp chuỗi key vượt giới hạn cho phép kết (1=0) (bảo mật) Bài 13: Các phần liên quan đến tốc độ - Không lock bảng chạy báo cáo  sử dụng with(nolock), vd báo cáo chứng từ - Không truy vấn lại nhiều lần Bỏ hàm xử lý cũ (thường dùng trực tiếp câu truy vấn select), thay vào store thực lấy liệu lần vào bảng tạm Ví dụ lấy lũy kế số dư cuối kỳ: bảng cân đối theo năm (cdkh, cdtk), có thêm bảng cân đối theo kỳ (cdkh$, cdtk$) bảng phát sinh theo kỳ (pskh$, pstk$, pstkdu$) Tránh trường hợp phải tính lại cân đối cho kỳ trước - Hạn chế tối đa điều kiện lọc truyền vào câu truy vấn: Cách viết cũ: Where ma_bp like rtrim(@group) +'%' Cách viết mới: IF @UnitKey ISNOTNULLSET @Key = @UnitKey IF @Group1 ''SET @Key = @Key + … IF @Group2 ''SET @Key = @Key + … IF @Group3 ''SET @Key = @Key + … - Hạn chế tối đa lệnh join không cần thiết Các viết cũ: luôn join dmkh, nhóm khách khơng truyền vào Cách viết mới: IF @Group1 + @Group2 + @Group3 ''SET @Join ='left join dmkh b on a.ma_kh = b.ma_kh' - Không truy vấn liệu vào bảng mà có bảng thay theo kỳ: ct00, ct70, ct70x, ctgt20, ctgt30, ctcp20, ctcp30, cdkh, cdtk Thay r00$yyyymm, r70, r90, r20, r30, r50, r60 Dùng stored chung để chạy script (FastBusiness$Partition$Execute) - Điều kiện lọc đơn vị sở: o Sử dụng function FastBusiness$Function$System$GetUnitFilter để lấy chuỗi điều kiện Hàm xử lý tối ưu tốc độ số trường hợp:  Nếu NSD admin : NULL  không cần kiểm tra điều kiện  Nếu NSD quyền : (1=0) o Trường hợp dùng stored FastBusiness$Partition$Execute truyền vào tham số @Unit (dvcs đk lọc) khơng cần dùng function (vd: rs_rptDCCustomer), trường hợp dùng store nhiều nơi nên dùng hàm để lấy câu điều kiện lần (vd: rs_rptStockSummary) - Lưuýcác with(index) => để không truyền nhầm; Các stored cũ thường dùng with(index(ngay_ct)) cho ct00, ct70; stored F1 khơng cần index F1 phân đoạn theo trường ngay_ct - Bỏ bớt trường không cần xuất báo cáo Lưu ý việc hạn chế liệu trả phải cache… o Select đủ số trường cần dùng o Nếu có trường ten ten2 trả nên giảm bớt liệu trường - SET NOCOUNT ON; SET ANSI_NULLS OFF; SET NOCOUNT OFF; SET ANSI_NULLS ON (rs_rptCashBook, rs_rptBalanceSheet…  ok; rs_Print22Tran, rs_COUpdateProductPrice2GL  not ok) Không thêm lệnh select ma_vt, sl_nhap into #tmp from r70$201201 select*from #tmp droptable #tmp Kết (331 row(s) affected) (331 row(s) affected) Có thêm lệnh SET NOCOUNT ON;SET ANSI_NULLS OFF select ma_vt, sl_nhap into #tmp from r70$201201 select*from #tmp droptable #tmp SET NOCOUNT OFF;SET ANSI_NULLS ON Kết Command(s) completed successfully - Lạm dụng hàm RTRIM, LTRIM nhiều, trường kiểu VARCHAR, NVARCHAR sử dụng làm cho tốc độ truy vấn chậm - Viết Sql cần hạn chế việc sử dụng CURSOR tối đa tốc độ sử lý cursor khác chậm Vd: đánh số thứ tự cho bảng #report(stt, ma_vt, ten_vt, so_luong) Thay dùng cursor, ta dùng bảng tạm cách Cursor select as stt, ma_vt, sl_nhap into #tmp from r70$201201 declare @ma_vt varchar(33), @i INT declare c cursorforselectdistinct ma_vt from #tmp orderby ma_vt set @i = open c fetch next from c into @ma_vt while@@fetch_status= begin set @i = @i + update #tmp set stt = @i where ma_vt = @ma_vt fetch next from c into @ma_vt end close c deallocate c select*from #tmp orderby stt droptable #tmp Cách dùng bảng tạm select as stt, ma_vt, sl_nhap into #tmp from r70$201201 createtable #stt(stt intidentity(1, 1), ma_vt varchar(33)) insertinto #stt selectdistinct ma_vt from #tmp orderby ma_vt update #tmp set stt =(select stt from #stt where #stt.ma_vt = #tmp.ma_vt) select*from #tmp orderby stt droptable #stt droptable #tmp - Khi tạo bảng tạm, số trường có giá trị gán cứng giá trị, Sql tự động hiểu trường NOT NULL, xử lý cần insert null vào trường ta thường sử dụng hàm dbo.ff_GetAlterFieldsNull  thay vào ta nên CAST giá trị trường để SQL tự hiểu trường NULL khơng cần Alter null lại cho trường Cách tạo trường stt NOT NULL select0 as stt, ma_vt, sl_nhap into #tmp from r70$201201 declare @q nvarchar(2000) select @q = dbo.ff_GetAlterFieldsNull('#tmp','stt','int') execsp_executesql @q insertinto #tmp selectnull,'zzzzzz',sum(sl_nhap)from #tmp select*from #tmp orderby stt droptable #tmp Cách tạo trường stt NULL selectcast(0 asint)as stt, ma_vt, sl_nhap into #tmp from r70$201201 insertinto #tmp selectnull,'zzzzzz',sum(sl_nhap)from #tmp select*from #tmp orderby stt droptable #tmp - Lấy liệu lần load form/show form, không request nhiều lần để lấy liệu ban đầu sau load form Vd: Bảng kê hóa đơn bán hàng (theo tài khoản) – rptAccountSalesInvoiceList: lấy tài khoản ngầm định cho hình lọc kiện Loading - Thiết kế excel hạn chế sử dụng nhiều cột, hạn chế merge nhiều… nhiều cột sử dụng, nhiều merge cell chậm - Thiết kế rpt hạn chế sử dụng nhiều parameter thừa (thư viện ràng buộc phần chế độ release) - Thiết kế rpt nên lọc trước liệu khơng cần thiết trước thay viết formula để xuất cần thiết Bài 14: Các vấn đề bảo mật - Các bảo mật có sẵn chương trình: o Chống đăng nhập tự động: đăng nhập sai x lần phải đóng trình duyệt lại Số lần x khai báo web.config o XSS (Cross Site Scripting): chèn javascript (trang web bị lỗi XSS dùng trình duyệt cũ, chưa update): lỗi bảo mật khai thác để cơng client khơng cơng server Thường XSS có dạng sau: http://www.xxx.com/index.aspx?msg=

Ngày đăng: 16/12/2019, 08:51

Tài liệu cùng người dùng

Tài liệu liên quan