我正在嘗試加入INFORMATION_SCHEMA.COLUMNS并sys.masked_columns通過sys.objects.
這是我的查詢:
SELECT
TABLE_SCHEMA,
TABLE_NAME,
COLUMN_NAME,
DATA_TYPE
CASE WHEN DATA_TYPE IN ('char', 'nchar', 'varchar', 'nvarchar', 'binary', 'varbinary')
AND CHARACTER_MAXIMUM_LENGTH > 0
THEN COALESCE('(' CONVERT(varchar, CHARACTER_MAXIMUM_LENGTH) ')', '')
ELSE ''
END
CASE WHEN DATA_TYPE IN ('decimal', 'numeric')
THEN COALESCE('(' CONVERT(varchar, NUMERIC_PRECISION) ',' CONVERT(varchar, NUMERIC_SCALE) ')', '')
ELSE ''
END AS Declaration_Type,
--CASE WHEN IS_NULLABLE='NO' THEN 'NOT ' ELSE '' END 'NULL' AS Nullable
m.is_masked,
m.masking_function
FROM
INFORMATION_SCHEMA.COLUMNS c
JOIN
sys.objects o ON c.table_name = o.name
JOIN
sys.masked_columns m ON o.[object_id] = m.[object_id]
ORDER BY
1, 2, 3
并回傳:
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | 宣告_型別 | is_masked | masking_function |
|---|---|---|---|---|---|
| 人 | 電子郵件地址 | 商業物體ID | 整數 | 1 | 電子郵件() |
| 人 | 電子郵件地址 | 電子郵件地址 | nvarchar(50) | 1 | 電子郵件() |
| 人 | 電子郵件地址 | 電子郵件地址ID | 整數 | 1 | 電子郵件() |
| 人 | 電子郵件地址 | 修改日期 | 約會時間 | 1 | 電子郵件() |
| 人 | 電子郵件地址 | 行引導 | 唯一識別符號 | 1 | 電子郵件() |
但結果是錯誤的,因為它顯示所有列Person.EmailAddress都被屏蔽了。
如果我檢查這個查詢:
SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function
FROM sys.masked_columns AS c
JOIN sys.tables AS tbl
ON c.[object_id] = tbl.[object_id]
WHERE is_masked = 1;
SSMS 僅回傳 1 個屏蔽列:
| 姓名 | 表名 | is_masked | masking_function | |
|---|---|---|---|---|
| 電子郵件地址 | 電子郵件地址 | 1 | 電子郵件() |
為什么要回傳Person.EmailAddress? 中的每一列?
uj5u.com熱心網友回復:
感謝@MartinSmith 和@JeroenMostert 在評論中提供的幫助。
正確的解決方案是去掉INFORMATION_SCHEMA.*列并改用sys.列:
mc.name AS column_name,
mc.is_masked,
mc.masking_function
, [Type] =
CASE
WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] '(' IIF(mc.max_length = -1, 'max', CAST(mc.max_length AS VARCHAR(25))) ')'
WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] '(' IIF(mc.max_length = -1, 'max', CAST(mc.max_length / 2 AS VARCHAR(25))) ')'
WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] '(' CAST(mc.[precision] AS VARCHAR(25)) ', ' CAST(mc.[scale] AS VARCHAR(25)) ')'
WHEN tp.[name] IN ('datetime2') THEN tp.[name] '(' CAST(mc.[scale] AS VARCHAR(25)) ')'
ELSE tp.[name]
END
FROM sys.masked_columns AS mc
JOIN sys.tables AS tbl ON mc.[object_id] = tbl.[object_id]
JOIN sys.types tp ON mc.user_type_id = tp.user_type_id
WHERE mc.is_masked = 1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/374323.html
標籤:sql-server 查询语句 加入 数据屏蔽
