【问题标题】:Hide data in SQL Server在 SQL Server 中隐藏数据
【发布时间】:2020-02-12 13:15:28
【问题描述】:

我需要一种技术来隐藏 SQL Server 中某列中的部分数据,这样当我查询它时它不可见,并且在使用时也不影响实际数据。

我不想添加隐藏列,因为这会破坏现有系统。请提出一些我可以遵循的想法或文档。

编辑: 带有

的表
  • 列表项

列 -

test_pk  |test_varchar
---------|-----------
1234     |$$$$test

现在我需要隐藏第二列中的 $$$$ 部分,并且在通过简单的选择查询获取数据时不使用它。

【问题讨论】:

  • SQL Server 没有“单元格”。表格有列和行,但是,没有“单元格”之类的东西;这是您在数据网格或 Excel 等显示层中找到的内容。
  • 猜测一下:使用VIEW 或类似名称,并使用STUFF 删除表中的前4 个字符和REVOKE 其他用户对SELECT 的权限。跨度>
  • 这听起来像您在列中有 2 条信息。这种事情违反了1NF。将每个数据元素移动到自己的列会更好。
  • @SeanLange:$$$$ 部分不是某些特定数据。这只是我想使用的一种模式,以识别这是我们发送给客户端的数据,而不是客户端自己加载到数据库中的数据。有没有其他方法可以在不更改数据的情况下识别相同的内容,并且客户在使用这些数据时知道或有任何影响?

标签: sql-server encryption mask


【解决方案1】:

SELECT test_pk, REPLACE(test_varchar, '$', '') AS test_varchar FROM tableName

注意:这将在所有位置隐藏 $ 字符,而不仅仅是在相关示例数据中显示的起始位置。

【讨论】:

  • 我有些怀疑 OP 真的有值 '$$$$test' 并且他们想隐藏 4 个 $ 字符。很可能是他们想要删除的else
【解决方案2】:

总而言之,DENY 用户对SELECT 的权限来自列并创建了一个计算列:

CREATE USER TestUser  WITHOUT LOGIN;
GO

CREATE TABLE dbo.TestTable (SomeColumn varchar(10),
                        SpecialColumn AS STUFF(SomeColumn,1,4,'') PERSISTED); --Appropriate expression to remove part you don't want goes here

INSERT INTO dbo.TestTable (SomeColumn)
VALUES('$$$$test')

GO
SELECT *
FROM dbo.TestTable;
GO

GRANT SELECT ON dbo.TestTable TO TestUser;

DENY SELECT ON dbo.TestTable (SomeColumn) TO TestUser;
GO

EXECUTE AS USER = 'TestUser';
GO
SELECT * --Will fail, but you should be declaring your columns, so doesn't matter
FROM dbo.TestTable;
GO
SELECT SomeColumn --Denied
FROM dbo.TestTable;
GO
SELECT SpecialColumn --Allowed
FROM dbo.TestTable;
GO
REVERT;

或者,如果在相关列上只喜欢GRANT 而不是SELECT(尽管这将更难维护):

--Clean up the last exercise
REVOKE SELECT ON dbo.TestTable (SomeColumn) TO TestUser;
REVOKE SELECT ON dbo.TestTable TO TestUser;
GO
--Now Grant only on SpecialColumn
GRANT SELECT ON dbo.TestTable (SpecialColumn) TO TestUser;
GO

EXECUTE AS USER = 'TestUser';
GO
SELECT * --Will fail, but you should be declaring your columns, so doesn't matter
FROM dbo.TestTable;
GO
SELECT SomeColumn --Denied
FROM dbo.TestTable;
GO
SELECT SpecialColumn --Allowed
FROM dbo.TestTable;
GO
REVERT

GO

--Clean up
DROP TABLE dbo.TestTable;
DROP USER TestUser;

【讨论】:

  • 嗨,为什么不简单的 replace() ?我不确定我是否正确理解了这个问题。
  • @MudassirHasan 您在自己的回答中做了一个很好的案例。如果 OP 的值为'$$$$ it is $10',它将替换错误的部分。当然,正如我评论的那样,我怀疑 OP 的样本是否代表了他们的真实数据。如果真的是这样,我认为这是一个“非问题”。
  • @MudassirHasan:我希望隐藏的数据保留在数据库中,以便我可以在需要时找到它。我想使用一个简单的选择查询,例如“从表中选择 *”,它不会显示数据的隐藏部分。
猜你喜欢
  • 2013-09-10
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多