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

我在 Azure SQL 实例(12.0.2000.8)中有一张表,当我查询它时,我发现了这种奇怪的行为。 enter image description here

该列被定义为整数,但它不响应“WHERE”过滤器,而且将其转换为varchar会返回奇怪的结果。这只发生在一个表格中(目前为止)。

这是怎么回事?这是一个 bug 吗?我做错了什么吗?我应该删除该表并重新创建吗?

更多信息: 当我查询该表时出现问题。如果我使用不同的机器和客户端,我得到相同的问题(JDBC 也有此问题)。

排序规则为 SQL_Latin1_General_CP1_CI_AS

谢谢!


为什么不鼓励上传文本、代码和数学表达式的图像?为什么不能上传代码/数据/错误的图像? - philipxy
1个回答

您在此表上启用了动态数据屏蔽,但用户未被授予UNMASK权限。

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

复现步骤:

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

INSERT dbo.Test 
    (c)
VALUES 
    (123);
CREATE USER Bob WITHOUT LOGIN;
GRANT SELECT 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;
cc_vc
0xxxx

如果我们授予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;
cc_vc
123123

整理一下:

DROP USER Bob;
DROP TABLE dbo.Test;