Bản phát hành Xem trước Kỹ thuật Cộng đồng (CTP) của SQL Server 2016, đã cho chúng tôi cơ hội dùng thử một số tính năng mới sẽ có trong phiên bản sắp tới.
Mặt nạ dữ liệu động
Tính năng này cho phép bạn bảo vệ dữ liệu bí mật khỏi những người dùng không được phép xem nó bằng cách che khuất một số hoặc tất cả nội dung của cột. Ví dụ:bạn có thể để lộ một phần số thẻ tín dụng để cho phép nhân viên bộ phận trợ giúp xem bốn chữ số cuối cùng; bạn có thể chọn che khuất hoàn toàn dữ liệu được giữ trong cột lương.
Nếu bạn đang sử dụng SQL Server CTP 2.0, bạn cần chạy lệnh này để kích hoạt tính năng tạo mặt nạ dữ liệu động:
DBCC TRACEON(209,219,-1)
Không sử dụng lệnh này nếu bạn đang sử dụng phiên bản CTP mới hơn, vì điều này sẽ vô hiệu hóa tính năng che dữ liệu động. (Nếu bạn đang sử dụng CTP 2.0 và bạn không chạy lệnh DBCC này hoặc bạn đang chạy CTP2.1 + và bạn làm chạy lệnh này, bạn sẽ gặp lỗi "Cú pháp không chính xác gần 'mặt nạ'" khi cố gắng xác định mặt nạ động cho một cột.
SQL sau tạo một bảng sử dụng mặt nạ dữ liệu động để che khuất nội dung của ba cột. Nội dung của CreditCard
cột bị lộ một phần. Những gì được hiển thị trong Phone
cột được để cho mặt nạ dữ liệu động. Giá trị mặc định cho cột chuỗi là "xxxx". Giá trị mặc định cho một cột số là "0". Email
cột sử dụng mặt nạ dữ liệu động đặc biệt hướng đến nội dung của cột đó.
CREATE TABLE Customer (ID int IDENTITY PRIMARY KEY, Name varchar(100) NOT NULL, CreditCard varchar(9) MASKED WITH (FUNCTION = 'partial(0,"xxxxx",4)') NULL, Phone varchar(12) MASKED WITH (FUNCTION = 'default()') NULL, Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL); INSERT INTO Customer VALUES('A Name', '111222333', '01937 860000', 'someone@somedomain')
Sử dụng isql
chương trình được bao gồm trong bản phân phối trình điều khiển ODBC SQL Server của chúng tôi, chúng tôi đăng nhập bằng tài khoản SQL Server không được phép xem nội dung của cột bị che:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016 myuser mypassword +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select * from customer +----+-------+-----------+-------+---------------+ | ID | Name | CreditCard| Phone | Email | +----+-------+-----------+-------+---------------+ | 1 | A Name| xxxxx2333 | xxxx | [email protected] | +----+-------+-----------+-------+---------------+
Sau đó, chúng tôi đăng nhập bằng tài khoản có đủ đặc quyền:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016 sa mypassword +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select * from customer +----+-------+-----------+--------------+------------------------+ | ID | Name | CreditCard| Phone | Email | +----+-------+-----------+--------------+------------------------+ | 1 | A Name| 111222333 | 01937 860000 | [email protected] | +----+-------+-----------+--------------+------------------------+
Hỗ trợ JSON
JavaScript Object Notation (JSON) là một định dạng văn bản tạo điều kiện thuận lợi cho việc trao đổi dữ liệu. Khi ngày càng nhiều nhà phát triển ứng dụng sử dụng JSON làm định dạng dữ liệu ưa thích của họ, nhu cầu về cơ sở dữ liệu thân thiện với JSON ngày càng tăng. Do đó, một số cơ sở dữ liệu NoSQL đã chọn JSON làm định dạng dữ liệu chính của chúng. Một trong những cơ sở dữ liệu như vậy là MongoDB.
Trên các máy thử nghiệm của mình, chúng tôi đã sử dụng hỗ trợ JSON của SQL Server 2016 để trao đổi dữ liệu giữa SQL Server và MongoDB.
Chúng tôi đã sử dụng chương trình sao chép hàng loạt (bcp) có trong bản phân phối trình điều khiển SQL Server ODBC của chúng tôi để xuất dữ liệu khách hàng mà chúng tôi đã tạo trước đó ở định dạng JSON. (Lệnh bcp kết nối với SQL Server dưới dạng "sa" và do đó dữ liệu trong các cột bị che sẽ được hiển thị.)
$ cd /usr/local/easysoft/sqlserver/bcp $ ./bcp "select * from customer for json auto" queryout customer.json -U sa -c Password: Starting copy... 1 row successfully bulk-copied to host file. Total received: 1 Clock Time (ms.) Total : 12129 Average : 0.082 rows per second $ more customer.json [{"ID":1,"Name":"A Name","CreditCard":"111222333","Phone":"01937 860000", "Email":"someone@somedomain"}]
Sau đó, chúng tôi đã nhập dữ liệu JSON vào MongoDB:
$ cd /opt/mongodb-linux-x86_64-ubuntu1404-3.0.7/bin $ ./mongoimport --db=SQLServer --collection=Customer --file=customer.json --jsonArray $ connected to: localhost imported 1 document
$ ./mongo MongoDB shell version: 3.0.7 connecting to: test > use SQLServer switched to db SQLServer > db.Customer.find() { "_id" : ObjectId("56334017f6df768ab87f2e8c"), "ID" : 1, "Name" : "A Name", "CreditCard" : "111222333", "Phone" : "01937 860000", "Email" : "someone@somedomain" } >
Bảo mật cấp hàng
Với tính năng Bảo mật cấp hàng, SQL Server 2016 có thể hạn chế quyền truy cập vào dữ liệu hàng dựa trên thông tin đăng nhập SQL Server. Bảo mật cấp độ hàng là minh bạch đối với người dùng SQL Server, họ không biết rằng các hàng mà họ không được phép xem đang được lọc khỏi kết quả truy vấn của họ.
Để thử tính năng này với trình điều khiển SQL Server ODBC của chúng tôi, chúng tôi đã tạo lại ví dụ bảo mật cấp hàng của Microsoft. Chúng tôi đã thực hiện việc này trong cơ sở dữ liệu có người dùng SQL Server có tên "Sales1" và "Sales2", những người này có SELECT
đặc quyền.
Chúng tôi đã tạo và điền một bảng với một số dữ liệu bán hàng. SalesRep
cột lưu trữ tên người dùng của đại diện bán hàng có liên quan.
CREATE TABLE Sales ( OrderID int, SalesRep sysname, Product varchar(10), Qty int ); INSERT Sales VALUES (1, 'Sales1', 'Valve', 5), (2, 'Sales1', 'Wheel', 2), (3, 'Sales1', 'Valve', 4), (4, 'Sales2', 'Bracket', 2), (5, 'Sales2', 'Wheel', 5), (6, 'Sales2', 'Seat', 5);
Bảo mật cấp hàng được triển khai với một hàm có giá trị bảng trả về một hàng duy nhất, nếu người dùng có quyền truy cập thích hợp hoặc không có kết quả. Trong ví dụ sau, hàm có giá trị bảng trả về một hàng nếu SalesRep
giống như người dùng thực hiện truy vấn.
CREATE SCHEMA Security; CREATE FUNCTION Security.fn_securitypredicate(@SalesRep AS sysname) RETURNS TABLE WITH SCHEMABINDING AS RETURN SELECT 1 AS fn_securitypredicate_result WHERE @SalesRep = USER_NAME(); CREATE SECURITY POLICY SalesFilter ADD FILTER PREDICATE Security.fn_securitypredicate(SalesRep) ON dbo.Sales WITH (STATE = ON);
Chúng tôi đã sử dụng trình điều khiển SQL Server ODBC để kết nối với cơ sở dữ liệu với tư cách là người dùng Sales2. Bảo mật cấp hàng đảm bảo rằng người dùng này chỉ có thể xem doanh số bán hàng do người dùng Bán hàng 2 thực hiện.
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016 Sales2 mypassword +---------------------------------------+ | Connected! | | | | sql-statement | | help [tablename] | | quit | | | +---------------------------------------+ SQL> select * from Sales +------------+----------+-----------+-------+ | OrderID | SalesRep | Product | Qty | +------------+----------+-----------+-------+ | 4 | Sales2 | Bracket | 2 | | 5 | Sales2 | Wheel | 5 | | 6 | Sales2 | Seat | 5 | +------------+----------+-----------+-------+ SQL> select * from Sales where OrderID = 1 +------------+----------+-----------+-------+ | OrderID | SalesRep | Product | Qty | +------------+----------+-----------+-------+ | | | | | +------------+----------+-----------+-------+
Trong cơ sở dữ liệu R
Với việc Microsoft mua Revolution Analytics, một nhà cung cấp phần mềm và dịch vụ cho ngôn ngữ lập trình R, họ có thể tích hợp R với SQL Server. SQL Server 2016 sẽ là phiên bản cơ sở dữ liệu đầu tiên kết hợp R, cho phép chạy mã R bên trong công cụ cơ sở dữ liệu SQL Server.
Nếu bạn có phiên bản SQL Server cũ hơn, thì giải pháp thay thế là trích xuất dữ liệu từ SQL Server sang R bằng cách sử dụng ODBC. Gói RODBC cung cấp giao diện ODBC cho R. Chúng tôi đã xây dựng RODBC dựa trên Trình quản lý trình điều khiển unixODBC có trong bản phân phối trình điều khiển SQL Server của chúng tôi và sau đó truy xuất một số dữ liệu SQL Server từ R:
# export ODBC_LIBS=/usr/local/easysoft/unixODBC/lib # export ODBC_INCLUDE=/usr/local/easysoft/unixODBC/include # R CMD INSTALL RODBC_1.3-12.tar.gz $ R > library("RODBC") > ch <- odbcConnect("SQLSERVER_2016") > sqlQuery(ch, paste("SELECT * from Customer")) ID Name CreditCard Phone Email 1 1 A Name 111222333 01937 860000 someone@somedomain