Truy vấn trong SQL?

Liên hệ QC
Xin chào quanluu1989,
Cảm ơn Bạn đã góp ý, đúng là khi lấy một lượng dữ liệu lớn từ máy chủ về thì nên thực hiện trực tiếp qua Sever ạ.
Vba trong trường hợp này vẫn có thể sử dụng được ạ,nếu dữ liệu không quá nhiều(khoảng hai trăm nghìn dòng trở xuống- do số lượng bản ghi đã khống chế từ câu lệnh lấy dữ liệu từ mày chủ).
Nhưng để đảm bảo có thể tổng hợp dữ liệu ở một khoảng thời gian dài thì việc sử dụng vba có thể sẽ bị treo do dữ liệu lấy về quá nhiều ạ.
Với ví dụ trên OT chưa hiểu và nắm bắt được phiền bạn giúp đỡ OT làm viết câu lệnh select theo tất cả điều kiện tín toán trong cột "TONG CONG" được không ạ.
Cảm ơn Bạn nhiều.
Vấn đề không hẳn là dữ liệu lớn vì dùng procedure chưa chắc nhanh hơn, mà quan trọng ở bảo mật, vì người dùng biết bạn đang truy vấn bảng nào, nếu người ta có quyền write thì người ta có thể làm nhiều việc xấu.

Còn query như sau:
SELECT MAHANG,TENHANG,CHUNGLOAI , sum(TONGCONG) AS TONGCONG
FROM TABLE
WHERE NGAY BETWEEN TU_NGAY AND DEN_NGAY
GROUP BY MAHANG,TENHANG,CHUNGLOAI
 
Lần chỉnh sửa cuối:
Xin chào các Bạn,

Nhờ các Bạn giúp đỡ OT sử dụng ADO/SQL để thực hiện trường hợp sau với ạ:
Từ bảng "DULIEU" lọc duy nhất 3 cột MAHANG,TENHANG,CHUNGLOAI,sau đó tính tổng số lượng theo vùng công thức màu hồng tím dựa vào điều kiện từ ngày đến ngày. Kết quả mong như bảng "TH_MH" ạ.
OT sử dụng câu lệnh "SELECT DISTINCT MAHANG,TENHANG,CHUNGLOAI" thì lấy được dữ liệu duy nhất của 3 trường, nhưng chưa biết cách tính toán cho vùng công thức màu hồng ạ.


View attachment 236068

View attachment 236069
Bạn thử code sau nhé:

Mã:
Sub TongHopDL_HLMT()
    Dim strDkNgay As String, strSQL As String, strLine As String, strGroup As String
    strDkNgay = " NGAYTHANG BETWEEN #2020-03-26# AND #2020-04-13# "
    strGroup = " MAHANG,TENHANG,CHUNGLOAI "
    strLine = " Val(iif(isnull(LINE_01),0,LINE_01)) as LINE_01,Val(iif(isnull(LINE_02),0,LINE_02)) as LINE_02,Val(iif(isnull(LINE_03),0,LINE_03)) as LINE_03,Val(iif(isnull(LINE_04) ,0,LINE_04))  as LINE_04 " & _
              ",Val(iif(isnull(LINE_05),0,LINE_05)) as LINE_05,Val(iif(isnull(LINE_06),0,LINE_06)) as LINE_06,Val(iif(isnull(LINE_07),0,LINE_07)) as  LINE_07,Val(iif(isnull(LINE_08),0,LINE_08)) as LINE_08 "
    strSQL = "Select " & strGroup & ",0 as SOLUONG,0 AS SL_KT,0 AS SL_LB," & strLine & " From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",SOLUONG ,0,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,SOLUONG,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE 'KHXX001'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,0,SOLUONG,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
        Sheet1.Range("A2").CopyFromRecordset .Execute("Select " & strGroup & ",Sum(SoLuong),Sum(SL_KT),Sum(SL_LB),Sum(SL_LB)/Sum(SoLuong),Sum(LINE_01),Sum(LINE_02),Sum(LINE_03),Sum(LINE_04),Sum(LINE_05),Sum(LINE_06),Sum(LINE_07),Sum(LINE_08) From ( " & strSQL & ") Group by " & strGroup)
    End With
End Sub
 
Bạn thử code sau nhé:

Mã:
Sub TongHopDL_HLMT()
    Dim strDkNgay As String, strSQL As String, strLine As String, strGroup As String
    strDkNgay = " NGAYTHANG BETWEEN #2020-03-26# AND #2020-04-13# "
    strGroup = " MAHANG,TENHANG,CHUNGLOAI "
    strLine = " Val(iif(isnull(LINE_01),0,LINE_01)) as LINE_01,Val(iif(isnull(LINE_02),0,LINE_02)) as LINE_02,Val(iif(isnull(LINE_03),0,LINE_03)) as LINE_03,Val(iif(isnull(LINE_04) ,0,LINE_04))  as LINE_04 " & _
              ",Val(iif(isnull(LINE_05),0,LINE_05)) as LINE_05,Val(iif(isnull(LINE_06),0,LINE_06)) as LINE_06,Val(iif(isnull(LINE_07),0,LINE_07)) as  LINE_07,Val(iif(isnull(LINE_08),0,LINE_08)) as LINE_08 "
    strSQL = "Select " & strGroup & ",0 as SOLUONG,0 AS SL_KT,0 AS SL_LB," & strLine & " From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",SOLUONG ,0,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,SOLUONG,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE 'KHXX001'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,0,SOLUONG,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
        Sheet1.Range("A2").CopyFromRecordset .Execute("Select " & strGroup & ",Sum(SoLuong),Sum(SL_KT),Sum(SL_LB),Sum(SL_LB)/Sum(SoLuong),Sum(LINE_01),Sum(LINE_02),Sum(LINE_03),Sum(LINE_04),Sum(LINE_05),Sum(LINE_06),Sum(LINE_07),Sum(LINE_08) From ( " & strSQL & ") Group by " & strGroup)
    End With
End Sub
Sao không dùng OR anh ơi strDkNgay & " AND CONGDOAN LIKE '%CD%' AND (PHANLOAI LIKE '%LB%'"OR PHANLOAI LIKE 'KHXX001'")
 
Bạn thử code sau nhé:

Mã:
Sub TongHopDL_HLMT()
    Dim strDkNgay As String, strSQL As String, strLine As String, strGroup As String
    strDkNgay = " NGAYTHANG BETWEEN #2020-03-26# AND #2020-04-13# "
    strGroup = " MAHANG,TENHANG,CHUNGLOAI "
    strLine = " Val(iif(isnull(LINE_01),0,LINE_01)) as LINE_01,Val(iif(isnull(LINE_02),0,LINE_02)) as LINE_02,Val(iif(isnull(LINE_03),0,LINE_03)) as LINE_03,Val(iif(isnull(LINE_04) ,0,LINE_04))  as LINE_04 " & _
              ",Val(iif(isnull(LINE_05),0,LINE_05)) as LINE_05,Val(iif(isnull(LINE_06),0,LINE_06)) as LINE_06,Val(iif(isnull(LINE_07),0,LINE_07)) as  LINE_07,Val(iif(isnull(LINE_08),0,LINE_08)) as LINE_08 "
    strSQL = "Select " & strGroup & ",0 as SOLUONG,0 AS SL_KT,0 AS SL_LB," & strLine & " From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",SOLUONG ,0,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,SOLUONG,0,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE 'KHXX001'"
    strSQL = strSQL & " Union all Select " & strGroup & ",0,0,SOLUONG,0,0,0,0,0,0,0,0 From [DULIEU$] WHERE " & strDkNgay & " AND CONGDOAN LIKE '%CD%' AND PHANLOAI LIKE '%LB%'"
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
        Sheet1.Range("A2").CopyFromRecordset .Execute("Select " & strGroup & ",Sum(SoLuong),Sum(SL_KT),Sum(SL_LB),Sum(SL_LB)/Sum(SoLuong),Sum(LINE_01),Sum(LINE_02),Sum(LINE_03),Sum(LINE_04),Sum(LINE_05),Sum(LINE_06),Sum(LINE_07),Sum(LINE_08) From ( " & strSQL & ") Group by " & strGroup)
    End With
End Sub
Vấn đề không hẳn là dữ liệu lớn vì dùng procedure chưa chắc nhanh hơn, mà quan trọng ở bảo mật, vì người dùng biết bạn đang truy vấn bảng nào, nếu người ta có quyền write thì người ta có thể làm nhiều việc xấu.

Còn query như sau:
SELECT MAHANG,TENHANG,CHUNGLOAI , sum(TONGCONG) AS TONGCONG
FROM TABLE
WHERE NGAY BETWEEN TU_NGAY AND DEN_NGAY
GROUP BY MAHANG,TENHANG,CHUNGLOAI

OT cảm ơn anh Hai Lúa Miền Tây & quanluu1989,
Hiện code của anh Hai Lúa OT đã test trên Excel OK rồi ạ, còn code của Bạn quanluu1989 OT chưa có điều kiện để làm thử trong SQL Server, khi có kết quả OT sẽ thông tin lại ạ.
Kính chúc GPE nhà mình đầu tháng vui vẻ & thành công.
 
Xin chào tất cả mọi người,
Hiện OT đang có một đoạn code bên dưới để lấy dữ liệu từ bảng "Orders" từ SQL đưa về Excel tại Worksheets("Sheet1").Range("A2:Z500")
OT muốn lấy thêm một bảng nữa cùng Database với "Orders" ví dụ "Produtions" , thì câu lệnh là "SELECT * FROM Produtions" để đưa vào Worksheets("Sheet1").Range("AA2:AH5000")

Xin mọi trợ giúp OT làm thế nào để có thể chạy 2 câu lệnh truy vấn này chỉ một lần chạy kết nối, nghĩa là đưa cả 2 bảng "Orders" và "Produtions"
Vào 2 vùng dữ liệu khác nhau khi chạy Sub ADOExcelSQLServer?

Mã:
Sub ADOExcelSQLServer()

    Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim SQLStr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    Server_Name = "Server_Name" ' Enter your server name here
    Database_Name = "DB_TEST" ' Enter your  database name here
    User_ID = "Sa" ' enter your user ID here
    Password = "246357" ' Enter your password here
    
    SQLStr = "SELECT * FROM Orders" ' Enter your SQL here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("A2:Z500")
        .ClearContents
        .CopyFromRecordset rs
    End With

    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub
 
Xin chào tất cả mọi người,
Hiện OT đang có một đoạn code bên dưới để lấy dữ liệu từ bảng "Orders" từ SQL đưa về Excel tại Worksheets("Sheet1").Range("A2:Z500")
OT muốn lấy thêm một bảng nữa cùng Database với "Orders" ví dụ "Produtions" , thì câu lệnh là "SELECT * FROM Produtions" để đưa vào Worksheets("Sheet1").Range("AA2:AH5000")

Xin mọi trợ giúp OT làm thế nào để có thể chạy 2 câu lệnh truy vấn này chỉ một lần chạy kết nối, nghĩa là đưa cả 2 bảng "Orders" và "Produtions"
Vào 2 vùng dữ liệu khác nhau khi chạy Sub ADOExcelSQLServer?

Em lặp lại việc gán câu lệnh SQL cho recordset mới trước khi đóng cn.

Mã:
Sub ADOExcelSQLServer()

    ...
  
    SQLStr = "SELECT * FROM Orders" ' Enter your SQL here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("A2:Z500")
        .ClearContents
        .CopyFromRecordset rs
    End With

'Thêm đoạn này.
SQLStr = "SELECT * FROM Production"
rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("AA2:AH5000")
        .ClearContents
        .CopyFromRecordset rs
    End With


    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub
 
Xin chào tất cả mọi người,
Hiện OT đang có một đoạn code bên dưới để lấy dữ liệu từ bảng "Orders" từ SQL đưa về Excel tại Worksheets("Sheet1").Range("A2:Z500")
OT muốn lấy thêm một bảng nữa cùng Database với "Orders" ví dụ "Produtions" , thì câu lệnh là "SELECT * FROM Produtions" để đưa vào Worksheets("Sheet1").Range("AA2:AH5000")

Xin mọi trợ giúp OT làm thế nào để có thể chạy 2 câu lệnh truy vấn này chỉ một lần chạy kết nối, nghĩa là đưa cả 2 bảng "Orders" và "Produtions"
Vào 2 vùng dữ liệu khác nhau khi chạy Sub ADOExcelSQLServer?

Mã:
Sub ADOExcelSQLServer()

    Dim Cn As ADODB.Connection
    Dim Server_Name As String
    Dim Database_Name As String
    Dim User_ID As String
    Dim Password As String
    Dim SQLStr As String
    Dim rs As ADODB.Recordset
    Set rs = New ADODB.Recordset

    Server_Name = "Server_Name" ' Enter your server name here
    Database_Name = "DB_TEST" ' Enter your  database name here
    User_ID = "Sa" ' enter your user ID here
    Password = "246357" ' Enter your password here
  
    SQLStr = "SELECT * FROM Orders" ' Enter your SQL here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("A2:Z500")
        .ClearContents
        .CopyFromRecordset rs
    End With

    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub
Có vẻ bạn cần tìm hiểu rõ SQL và ADO thêm chút là biến tấu được, khỏi nhờ diễn đàn chi cho vất vả
 
Em lặp lại việc gán câu lệnh SQL cho recordset mới trước khi đóng cn.

Mã:
Sub ADOExcelSQLServer()

    ...
 
    SQLStr = "SELECT * FROM Orders" ' Enter your SQL here

    Set Cn = New ADODB.Connection
    Cn.Open "Driver={SQL Server};Server=" & Server_Name & ";Database=" & Database_Name & _
    ";Uid=" & User_ID & ";Pwd=" & Password & ";"

    rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("A2:Z500")
        .ClearContents
        .CopyFromRecordset rs
    End With

'Thêm đoạn này.
SQLStr = "SELECT * FROM Production"
rs.Open SQLStr, Cn, adOpenStatic

    With Worksheets("Sheet1").Range("AA2:AH5000")
        .ClearContents
        .CopyFromRecordset rs
    End With


    rs.Close
    Set rs = Nothing
    Cn.Close
    Set Cn = Nothing
End Sub

Xin chào ongke0711,
Đúng rồi Anh rồi anh, vậy mà OT không nghĩ ra nên cứ để việc kết nối đóng & lặp lại nhiều lần.
Cảm ơn Anh nhiều ạ.

Có vẻ bạn cần tìm hiểu rõ SQL và ADO thêm chút là biến tấu được, khỏi nhờ diễn đàn chi cho vất vả

Cảm ơn Bạn, không có diễn đàn không có các Thầy/Bác/Anh/Chị và các Bạn ở đây là mình chết chắc đó :D
 
Đúng rồi Anh rồi anh, vậy mà OT không nghĩ ra nên cứ để việc kết nối đóng & lặp lại nhiều lần.

Đây là lý do trong mấy file làm demo lúc trước, anh luôn có hàm tạo kết nối (connection) riêng và hàm lấy Recordset riêng chứ không gộp chung vô cái hàm như của em hiện tại.
- Khi khởi chạy sẽ gọi hàm kết nối rồi để đó.
- Lấy recordset các kiểu, sau khi xong mới đóng kết nối.
Với hàm kết nối độc lập, trong vài trường hợp khi xử lý recordset cần ngắt kết nối tạm thời thì vẫn có thể chủ động ngắt rồi tạo lại sau khi xử lý xong Recordset, cập nhật về hệ thống.
 
Xin chào các Bạn,
Hiện OT đang sử dụng câu lệnh truy vấn lấy dữ liệu trong SQL từ ngày đến ngày thì được dữ liệu như bảng 1 (các mã hàng thể hiện chi tiết theo từng ngày).
Giờ OT mong muốn cũng câu lệnh truy vấn từ ngày đến ngày này nhưng số lượng cho từng mã hàng được thể hiện theo từng tháng (cộng gộp các ngày trong tháng) như bảng 2.
Thì câu lệnh truy vấn được viết thế nào ạ?
 

File đính kèm

  • DAY_TO_MONTH.xlsx
    460.7 KB · Đọc: 10
Xin chào các Bạn,
Hiện OT đang sử dụng câu lệnh truy vấn lấy dữ liệu trong SQL từ ngày đến ngày thì được dữ liệu như bảng 1 (các mã hàng thể hiện chi tiết theo từng ngày).
Giờ OT mong muốn cũng câu lệnh truy vấn từ ngày đến ngày này nhưng số lượng cho từng mã hàng được thể hiện theo từng tháng (cộng gộp các ngày trong tháng) như bảng 2.
Thì câu lệnh truy vấn được viết thế nào ạ?
Em dùng hàm Format, Code sau chưa đưa điều kiện lọc, em tự thêm vào nhé.

Mã:
Sub TongHopDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
        Sheet1.Range("M6").CopyFromRecordset .Execute("Select [CODE],format([DATE],'mm-yyyy'),SUM(QTY) from [Sheet1$A5:C15000] Group by [CODE],format([DATE],'mm-yyyy')")
        
    End With
End Sub
 
Em dùng hàm Format, Code sau chưa đưa điều kiện lọc, em tự thêm vào nhé.

Mã:
Sub TongHopDL_HLMT()
    With CreateObject("ADODB.Connection")
        .Open ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended Properties=Excel 12.0")
        Sheet1.Range("M6").CopyFromRecordset .Execute("Select [CODE],format([DATE],'mm-yyyy'),SUM(QTY) from [Sheet1$A5:C15000] Group by [CODE],format([DATE],'mm-yyyy')")
       
    End With
End Sub
Cảm ơn anh Hai Lúa nhiều ạ, câu lệnh đúng ý OT ạ.
OT đang tìm hiểu câu lệnh SELECT SUM..GROUP BY.. nhưng cách của anh đơn giản hơn & dễ ứng dụng hơn ạ.
 
Xin chào các Bạn,
Các Bạn cho OT hỏi có cách nào thiết lập trong SQL-Database để truy vấn từ ứng dụng Excel đến nó chỉ sử dụng được duy nhất câu lệnh Select không thôi?
 
Em nên tạo các Store Procedure, View rồi sau đó gọi nó thôi.
Xin chào anh Hai Lúa,
Cảm ơn anh đã gợi ý cho OT.
Có phải OT hiểu như thế này không ạ, nghĩa là không có cách nào khác khi truy vấn trực tiếp đến bảng gốc
mà phải tạo một bản sao cho bảng đó trong SQL và từ Excel sẽ gọi bảng bản sao này phải không anh?
 
Xin chào anh Hai Lúa,
Cảm ơn anh đã gợi ý cho OT.
Có phải OT hiểu như thế này không ạ, nghĩa là không có cách nào khác khi truy vấn trực tiếp đến bảng gốc
mà phải tạo một bản sao cho bảng đó trong SQL và từ Excel sẽ gọi bảng bản sao này phải không anh?
Hiểu nôm na Store Procedure giống như 1 hàm, ví dụ như hàm trong Excel. Khi cần tìm hay lấy dữ liệu ra bảng khác thì bạn phải vào bảng gốc để tìm, lọc... rồi lấy kết quả đưa chỗ khác. Nhưng bạn dùng hàm thì không phải thao tác trực tiếp trên bảng gốc. Hàm sẽ lấy dữ liệu thảo điều kiện.
Quay lại Store Procedure hơn chỗ là nó có thể thực hiệc các lệnh thêm, sửa, xóa vào dữ liệu bảng gốc.
 
Các Bạn cho OT hỏi có cách nào thiết lập trong SQL-Database để truy vấn từ ứng dụng Excel đến nó chỉ sử dụng được duy nhất câu lệnh Select không thôi?

Nếu em có quyền trong SQL Server Management Stufio thì em vô folder Security -> Login -> Tạo user và thiết lập "User Mapping" tới cái Database mà em muốn chỉ cho dùng "SELECT.." là: db_datareader
 
Hiểu nôm na Store Procedure giống như 1 hàm, ví dụ như hàm trong Excel. Khi cần tìm hay lấy dữ liệu ra bảng khác thì bạn phải vào bảng gốc để tìm, lọc... rồi lấy kết quả đưa chỗ khác. Nhưng bạn dùng hàm thì không phải thao tác trực tiếp trên bảng gốc. Hàm sẽ lấy dữ liệu thảo điều kiện.
Quay lại Store Procedure hơn chỗ là nó có thể thực hiệc các lệnh thêm, sửa, xóa vào dữ liệu bảng gốc.
Cảm ơn anh Hai Lúa
OT sẽ tìm hiểu thêm về Store Procedure ạ.
Vấn đề của OT là làm sao để ko cho phép từ ứng dụng Excel ngoài sử dụng câu lệnh select ra thì không được sử dụng câu lệnh khác ấy ạ.
Ví dụ: Từ Excel OT đang sử dụng câu lệnh "Select * from ODER" nếu OT sử dụng câu lệnh khác Select thì sẽ không được ạ.
Nếu sửa code trong Excel thì có thể được nhưng đã là code trong Excel rồi thì vẫn có thể bỏ đi được nếu người nào hiểu code.
OT muốn hỏi cách thiết lập trong SQL để người dùng có sửa code trong Excel thế nào thế nào đi nữa thì cũng chỉ sử dụng được câu lệnh Select thôi ạ.
Không biết là có thể khắc phục được vde này không anh vì nó liên quan đến vấn đề bảo mật anh ạ.
Cảm ơn anh Hai Lúa
Bài đã được tự động gộp:

Nếu em có quyền trong SQL Server Management Stufio thì em vô folder Security -> Login -> Tạo user và thiết lập "User Mapping" tới cái Database mà em muốn chỉ cho dùng "SELECT.." là: db_datareader
Xin chào anh ongke0711,
Cảm ơn anh đã quan tâm và giúp đỡ,hình như đúng là cái này rồi ạ.
Phiền anh ongke0711 có thể hướng dẫn OT chi tiết một chút được không ạ, OT được phép đụng đến SQL mới đầu cảm thấy hứng thú nhưng sau khi biết thêm một chút thì lại thấy nó cũng nguy hiểm nên thấy lo lắng anh ạ.
 
Cảm ơn anh đã quan tâm và giúp đỡ,hình như đúng là cái này rồi ạ.
Phiền anh ongke0711 có thể hướng dẫn OT chi tiết một chút được không ạ, OT được phép đụng đến SQL mới đầu cảm thấy hứng thú nhưng sau khi biết thêm một chút thì lại thấy nó cũng nguy hiểm nên thấy lo lắng anh ạ.

Em tạo User Login rồi test xem User đó hoạt động như thế nào, không ảnh hưởng gì đâu. Tạo một Database tạm rồi thử nghiệm trên database đó thôi. Trong hình cái database "abc" là database tạm.

User1.png User2.png


User3.png

User4.png
 
Web KT
Back
Top Bottom