Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2016

Изданието за технически преглед на общността (CTP) на SQL Server 2016 ни даде възможност да изпробваме някои от новите функции, които ще бъдат налични в предстоящата версия.

Динамично маскиране на данни

Тази функция ви позволява да защитите поверителни данни от потребители, които не са упълномощени да ги виждат, като прикриете част или цялото съдържание на колона. Например, можете да разкриете част от номера на кредитна карта, за да позволите на служителите на бюрото за помощ да видят последните четири цифри; може да изберете напълно да скриете данните, съхранявани в колона за заплати.

Ако използвате SQL Server CTP 2.0, трябва да изпълните тази команда, за да активирате динамично маскиране на данни:

DBCC TRACEON(209,219,-1)

Не използвайте тази команда, ако използвате по-нова версия на CTP, тъй като това ще деактивира динамичното маскиране на данни. (Ако използвате CTP 2.0 и не изпълнете тази DBCC команда или изпълнявате CTP2.1+ и правите изпълнете тази команда, ще получите грешката „Неправилен синтаксис близо до „маскиран““, когато се опитвате да дефинирате динамична маска за колона.

Следният SQL създава таблица, която използва динамично маскиране на данни, за да скрие съдържанието на три колони. Съдържанието на CreditCard колона са частично открити. Какво се разкрива в Phone колоната е оставена на маската за динамични данни. По подразбиране за колона низ е "xxxx". По подразбиране за цифрова колона е "0". Email колоната използва динамична маска на данни, специално насочена към съдържанието на тази колона.

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')

Използване на isql програма, включена в нашата дистрибуция на драйвери на SQL Server ODBC, ние влизаме с акаунт на SQL Server, който не е оторизиран да преглежда съдържанието на маскирана колона:

$ /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] |
+----+-------+-----------+-------+---------------+

След това влизаме с акаунт, който има достатъчно привилегии:

$ /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] |
+----+-------+-----------+--------------+------------------------+

Поддръжка на JSON

JavaScript Object Notation (JSON) е текстов формат, който улеснява обмена на данни. Тъй като все повече разработчици на приложения приемат JSON като предпочитан формат на данни, необходимостта от удобни за JSON бази данни нараства. В резултат на това няколко бази данни NoSQL са избрали JSON като основен формат на данни. Една такава база данни е MongoDB.

На нашите тестови машини използвахме поддръжката на JSON на SQL Server 2016 за обмен на данни между SQL Server и MongoDB.

Използвахме програмата за групово копиране (bcp), включена в дистрибуцията на нашия SQL Server ODBC драйвер, за да експортираме клиентските данни, които създадохме по-рано във формат JSON. (Командата bcp се свързва със SQL Server като „sa“ и така данните в маскираните колони са изложени.)

$ 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"}]

След това импортирахме JSON данните в 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" }
>

Сигурност на ниво ред

Със своята функция за защита на ниво ред, SQL Server 2016 е в състояние да ограничи достъпа до данни на ред въз основа на вход в SQL Server. Защитата на ниво ред е прозрачна за потребителите на SQL Server, те не знаят, че редовете, които не са упълномощени да виждат, се филтрират от резултатите от техните заявки.

За да изпробвате тази функция с нашия SQL Server ODBC драйвер, възпроизведехме примера за сигурност на ниво ред на Microsoft. Направихме това в база данни, която имаше потребители на SQL Server, наречени "Sales1" и "Sales2", които имат SELECT привилегии.

Създадохме и попълнихме таблица с някои данни за продажбите. SalesRep колоната съхранява потребителското име на съответния търговски представител.

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);

Защитата на ниво ред е реализирана с функция с таблично стойност, която или връща един ред, ако потребителят има подходящ достъп, или няма резултати. В следващия пример функцията с таблица с стойност връща ред, ако SalesRep колоната е същата като потребителя, изпълняващ заявката.

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);

Използвахме ODBC драйвера на SQL Server, за да се свържем с базата данни като потребител на Sales2. Защитата на ниво ред гарантира, че този потребител може да вижда само продажбите, направени от потребителя Sales2.

$ /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   |
+------------+----------+-----------+-------+
|            |          |           |       |
+------------+----------+-----------+-------+

В базата данни R

С покупката от Microsoft на Revolution Analytics, доставчик на софтуер и услуги за езика за програмиране R, те могат да интегрират R със SQL Server. SQL Server 2016 ще бъде първата версия на базата данни, която включва R, което позволява R код да се изпълнява в двигателя на базата данни на SQL Server.

Ако имате по-ранна версия на SQL Server, алтернативата е да извлечете данни от SQL Server в R с помощта на ODBC. Пакетът RODBC предостави ODBC интерфейс за R. Изградихме RODBC срещу unixODBC Driver Manager, включен в дистрибуцията на драйвера на нашия SQL Server, и след това извлечехме някои данни от SQL Server от 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Таблица за изчисление за вмъкване на липсващи дати между две дати? SQL

  2. Пребройте редовете на час в SQL Server с пълна стойност за дата и час като резултат

  3. T-SQL:Закръгля до най-близкия интервал от 15 минути

  4. Как да използвате SqlTransaction в C#

  5. Получаване на актуализиран ред