【问题标题】:hide a column from table in MS SQL Server在 MS SQL Server 中隐藏表中的列
【发布时间】:2016-09-12 19:34:35
【问题描述】:

谁能分享在 SQL Server 2012 中从表中隐藏特定列的步骤,因为我不想删除该列

隐藏我的意思是每当我对那个特定的表使用选择查询时,它永远不应该向我显示该列。

有可能吗? 无论任何用户登录和我使用什么查询,我都需要将该列设为隐藏

第三方编辑

根据But the problem is whenever i open the table in sql i dont want to see that particular column 的评论,我认为问题是:

  • 如何配置,以便在 sql management studio 中打开表定义以仅显示连接用户有权选择的列?

下面的屏幕截图显示了表 Employee 的所有列,尽管登录 StackoverIntern 对列 SSN, Salary 没有选择权限

【问题讨论】:

  • 请描述一下“隐藏”是什么意思。
  • 编辑了我的问题@GordonLinoff
  • 而java应用程序是如何连接的?它必须有一些用户上下文。无论如何,如果您不希望在您的 java 应用程序中使用此列,请不要将其包含在您的 SELECT 子句中。你知道SELECT * 通常是不好的做法,对吧?

标签: ssms sql sql-server sql-server-2012


【解决方案1】:

迟到了,但我认为值得分享

在 SQLSERVER-2016 之前,当 selecting * 时,没有任何选项可以从表中隐藏几列,但是 SQLSERVER-2016 提出了 HIDDEN 关键字,您现在可以通过它设置隐藏在 Select * 之外的列'不想显示并且只想要你的业务逻辑的一些后台进程。

HIDDEN 属性是可选的,将隐藏这些列 从一个标准的 SELECT 语句向后兼容我们的 申请和查询。您不能将 HIDDEN 属性应用于现有列

.

您也可以更改现有表,让我们以现有表为例

ALTER TABLE [dbo].[Account] ALTER COLUMN [StartDate] ADD HIDDEN;
ALTER TABLE [dbo].[Account] ALTER COLUMN [EndDate] ADD HIDDEN;

你可以在Temporal table查看这个更常用的概念

您可以在下面的Temporal Table 中找到更多信息

【讨论】:

  • ADD HIDDEN 仅适用于 Temporal 表期间列,不能用于普通列。
  • @WindsofChange 是的,你是对的。我在描述中也提到过
【解决方案2】:

您可以使用column level permissions,以便目标用户无法在该列上进行选择。但是,在执行SELECT *SELECT SpecialColumn 的情况下,这不会“隐藏”列。相反,它将查询失败,从而导致错误。

为了便于查询,您可以创建一个不包含此列的视图:

create view MyTableEx As
    SELECT Every, Other, Column
    FROM MyTable

然后只为某些用户授予视图而不是表的 SELECT 权限。然而,这对于应用程序来说仍然是个问题,它现在必须知道它应该从表中选择还是从视图中选择。

归根结底,列级权限在数据库中是一种不自然的事情。

【讨论】:

  • 除非视图名与表名相同。 OP 可以为视图使用单独的模式,并且只允许通过使用的登录名访问该特定模式。 Table Name: [dbo].MyTableNameView Name: [CustomSchema].MyTableName。授予对 [CustomSchema] 的登录访问权限。
【解决方案3】:

如果您不想显示该列,则不应将其包含在您的 select 语句中。在您的选择语句中不使用asterisk (*) 也会更有效。

有关性能问题的更多信息,请参阅此帖子: Performance issue in using SELECT *?

【讨论】:

    猜你喜欢
    • 2013-09-10
    • 2019-01-03
    • 2020-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多