这是一个错误还是我在创建表时做错了什么?

Des*_*que 14 azure-sql-database

我在 Azure SQL 实例 (12.0.2000.8) 中有一个表,当我查询它时发现了这种奇怪的行为。 在此输入图像描述

该列被定义为 Integer,但它不响应“WHERE”过滤器,也转换为 varchar 返回奇怪的结果。它只发生在一张表中(到目前为止)。

这里发生了什么?是一个错误吗?难道我做错了什么?我应该删除该表并重新创建它吗?

更多信息:当我查询表时出现问题。如果我使用不同的机器和客户端,我会遇到同样的问题(JDBC 也会发生这种情况)。

排序规则为 SQL_Latin1_General_CP1_CI_AS

谢谢!

Pau*_*ite 32

您对该表进行了动态数据屏蔽,并且用户尚未被授予UNMASK权限。

您在输出中看到屏蔽数据,而不是真实值。

重现:

CREATE TABLE dbo.Test 
(
    c integer
        MASKED WITH (FUNCTION = 'default()')
        NOT NULL 
);

INSERT dbo.Test 
    (c)
VALUES 
    (123);
Run Code Online (Sandbox Code Playgroud)
CREATE USER Bob WITHOUT LOGIN;
GRANT SELECT ON dbo.Test TO Bob;
Run Code Online (Sandbox Code Playgroud)
EXECUTE AS USER = 'Bob';

SELECT
    T.c,
    c_vc = CONVERT(varchar(11), T.c)
FROM dbo.Test AS T
WHERE
    T.c <> 0;

REVERT;
Run Code Online (Sandbox Code Playgroud)
C c_vc
0 xxxx

如果我们授予UNMASK,真实数据就会变得可见:

GRANT UNMASK ON dbo.Test TO Bob;

EXECUTE AS USER = 'Bob';

SELECT
    T.c,
    c_vc = CONVERT(varchar(11), T.c)
FROM dbo.Test AS T
WHERE
    T.c <> 0;

REVERT;
Run Code Online (Sandbox Code Playgroud)
C c_vc
123 123

整理:

DROP USER Bob;
DROP TABLE dbo.Test;
Run Code Online (Sandbox Code Playgroud)