バージョンに応じて、さまざまなツールでクライアント ツールがクエリ テキストを難読化する場合がいくつかあります。
- の用法
sp_password
- ログインの作成
WITH PASSWORD
WITH ENCRYPTION
オプション_
- 特定の暗号化/復号化機能
@Lamakの功績により、これを見て、これを試してください:
CREATE LOGIN Lamak WITH PASSWORD = 'W0W, L@m@k is $m@rt!';
バージョンに応じて、SSMS は、作成し** Restricted Text **
た実際のコマンドの代わりに計画を提供するか、計画をまったく提供しません。最近のバージョンは、DDL の計画を公開することを気にしないと思います。この情報をどうするつもりですか?最適化しCREATE LOGIN
ますか? にインデックスを追加しsys.server_principals
ますか? DDL を最適化するためにこれらのことを行うことはできません。
ただし、クエリ テキストがこの難読化に置き換えられたとしても、欠落しているインデックスが表示されるのをブロックするべきではありません。ブロックされているのはクエリ テキストであり、不足しているインデックスの提案ではありません。以下は、AdventureWorks のお気に入りのコピーを使用した証明です。
USE AdventureWorks;
GO
CREATE SYMMETRIC KEY SymKey1 WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'abcd1234$%^&';
OPEN SYMMETRIC KEY symKey1 DECRYPTION BY PASSWORD = 'abcd1234$%^&';
次に、実際の実行計画をオンにします。
SELECT TOP (10) DecryptByKey(CreditCardApprovalCode),
SalesOrderID, PurchaseOrderNumber, CreditCardApprovalCode
FROM Sales.SalesOrderHeader
WHERE PurchaseOrderNumber LIKE 'PO147%';
結果:
最初は、SSMS がテキストを覆い隠していると思っていましたが、そうではありません。これはプラン XML にあるため、実際のテキストが出ないようにしているのは SQL Server 自体です。おそらく機密性の高いパスワードを明らかにするバッチの部分が後で他のユーザーに送信されないように、テキストを隠す必要があると思われます (ショープランを保存して渡すと発生する可能性があります)。XML を調べて、これを確認できます。
<Batch>
<Statements>
<StmtSimple ... StatementText="** Restricted Text **" ...
であることもわかりINPUTBUFFER
ますNULL
。実際の実行計画をオフにして、クエリを再度実行し、別のウィンドウから次を実行します。
DBCC INPUTBUFFER(<spid from first window>);
Event Info
列は になりますNULL
。また、クエリ プランが保存されていないこともわかります。
SELECT * FROM sys.dm_exec_query_stats AS s
CROSS APPLY sys.dm_exec_sql_text(s.sql_handle) AS t
WHERE t.text LIKE '%Decrypt'+'ByKey(%';
ここで、クエリを再度実行しますが、今回はDecryptByKey
少しコメントアウトします。
SELECT TOP (10) --DecryptByKey(CreditCardApprovalCode),
SalesOrderID, PurchaseOrderNumber, CreditCardApprovalCode
FROM Sales.SalesOrderHeader
WHERE PurchaseOrderNumber LIKE 'PO147%';
ここで、上記の DMV に対するクエリは 1 行 (コメントアウトされた参照を含む行) を返します。また、DBCC INPUTBUFFER
の代わりに実行したクエリが表示されますNULL
。
クリーンアップすることを忘れないでください:
CLOSE SYMMETRIC KEY symKey1;
DROP SYMMETRIC KEY symKey1;