SQLServer2016のCommunityTechnicalPreview(CTP)リリースでは、次のバージョンで利用できるようになる新機能のいくつかを試す機会が与えられました。
動的データマスキング
この機能を使用すると、列の内容の一部またはすべてを隠すことにより、機密データの表示を許可されていないユーザーから機密データを保護できます。たとえば、クレジットカード番号の一部を公開して、ヘルプデスクのスタッフが最後の4桁を確認できるようにすることができます。給与列に保持されているデータを完全に隠すことを選択する場合があります。
SQL Server CTP 2.0を使用している場合は、次のコマンドを実行して動的データマスキングを有効にする必要があります。
DBCC TRACEON(209,219,-1)
それ以降のバージョンのCTPを使用している場合は、このコマンドを使用しないでください。動的データマスキングが無効になります。 (CTP 2.0を使用していて、使用しない場合 このDBCCコマンドを実行するか、CTP2.1+を実行していて実行します。 このコマンドを実行すると、列の動的マスクを定義しようとすると、「'masked'の近くの構文が正しくありません」というエラーが表示されます。
次のSQLは、動的データマスキングを使用して3つの列の内容を隠すテーブルを作成します。 CreditCardの内容 カラムが部分的に露出しています。 Phoneで公開されるもの 列は動的データマスクに残されます。文字列列のデフォルトは「xxxx」です。数値列のデフォルトは「0」です。 Email columnは、その列のコンテンツに特化した動的データマスクを使用します。
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ドライバー配布に含まれているプログラムでは、マスクされた列の内容を表示する権限がないSQLServerアカウントでログインします。
$ /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 | sxxx@xxxx.com | +----+-------+-----------+-------+---------------+
次に、十分な権限を持つアカウントでログインします。
$ /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 | someone@somedomain.com | +----+-------+-----------+--------------+------------------------+
JSONサポート
JavaScript Object Notation(JSON)は、データの交換を容易にするテキスト形式です。より多くのアプリケーション開発者が優先データ形式としてJSONを採用するにつれて、JSONに適したデータベースの必要性が高まっています。結果として、いくつかのNoSQLデータベースは主要なデータ形式としてJSONを選択しています。そのようなデータベースの1つがMongoDBです。
テストマシンでは、SQL Server 2016のJSONサポートを使用して、SQLServerとMongoDBの間でデータを交換しました。
SQL Server ODBCドライバーのディストリビューションに含まれているバルクコピープログラム(bcp)を使用して、以前に作成した顧客データをJSON形式でエクスポートしました。 (bcpコマンドは「sa」としてSQL Serverに接続するため、マスクされた列のデータが公開されます。)
$ 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は、SQLServerのログインに基づいて行データへのアクセスを制限できます。行レベルのセキュリティはSQLServerユーザーに対して透過的であり、表示が許可されていない行がクエリ結果からフィルタリングされていることに気づいていません。
SQL Server ODBCドライバーでこの機能を試すために、Microsoftの行レベルのセキュリティの例を再現しました。これは、SELECTを持つ「Sales1」および「Sales2」という名前のSQLServerユーザーがいるデータベースで行いました。 特権。
テーブルを作成し、いくつかの販売データを入力しました。 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);
SQL Server ODBCドライバーを使用して、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
Rプログラミング言語用のソフトウェアとサービスのプロバイダーであるRevolutionAnalyticsをMicrosoftが購入したことで、RをSQLServerと統合できるようになりました。 SQL Server 2016は、Rを組み込んだデータベースの最初のバージョンであり、SQLServerデータベースエンジン内でRコードを実行できるようにします。
以前のバージョンのSQLServerを使用している場合は、ODBCを使用してSQLServerからRにデータを抽出することもできます。 RODBCパッケージは、R用のODBCインターフェイスを提供しました。SQLServerドライバーのディストリビューションに含まれているunixODBCドライバーマネージャーに対してRODBCを構築し、RからSQLServerデータを取得しました。
# 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