3

我有一个 SQL Server 表,其中有四列,其中一列是默认值为getdate(). 我有这个表的两个副本,一个在我可以完全控制的开发数据库服务器中,另一个在我几乎没有权限的生产数据库服务器中。

以下是开发表的外观:

在此处输入图像描述

我选择了 dtInsert 列。请注意,此列的默认值为getdate()。我这张表的生产版本是完全一样的。当我向该表中添加一行时,dtInsert 单元格默getdate()认为我所期望的。当数据库管理员生成生产表的脚本时,它包含默认值约束。但是,当我在 SQL Server Management Studio 2012 中查看表设计时,它显示该列没有默认值。看这里:

在此处输入图像描述

当我生成数据库图时,它还显示 dtInsert 列没有默认值。同样,我通过测试知道我的生产数据库服务器中的 dtinsert 列确实默认为getdate().

这是 SQL Server Management Studio 2012 版中的错误吗?是否有一些我没有的权限会导致这种行为?是别的吗?为什么该列似乎没有默认值,即使它有?

4

2 回答 2

5

这是 SQL Server Management Studio 2012 版中的错误吗?

不。

是否有一些我没有的权限会导致这种行为?

是的。

在对问题的评论中,我建议运行以下命令:

SELECT *
FROM sys.default_constraints
WHERE [parent_object_id] = OBJECT_ID(N'_table_name_');

结果是 Production 中的行返回,其中[definition]列是NULL。这意味着 DEFAULT CONSTRAINT 存在,但您要么:

  • 缺乏查看定义的显式和隐含权限

  • 已被明确拒绝查看它的权限。

您可以在 MSDN 页面上阅读有关Metadata Visibility Configuration的内容。

现在,有多种权限(VIEW DEFINITIONVIEW ANY DEFINITION等)会影响此设置。这些可以应用于各个级别:

  • 对象本身
  • 架构
  • 数据库
  • ETC

考虑到多个 Windows 组中的成员身份(如果正在使用这些组),权限会变得更加复杂。

甚至可以在多个级别授予权限。权限也是附加的:在您的登录名所属的 3 个 Windows 组中的 1 个中的 GRANT 足以工作。但是,任何这些级别中的拒绝优先,在这种情况下,您没有定义。

正如我在对该问题的评论中提到的,这实际上是生产 DBA 的问题,他们配置了权限,以至于您看不到定义。如果不确切知道为什么看不到定义(缺少 GRANT 或存在 DENY?),发出 GRANT 语句试图获得此权限是没有用的(特别是因为无法看到定义意味着您同样不会能够向任何人授予此类权限)。请与负责生产的人交谈,告诉他们您看不到默认约束的定义,但您希望能够看到。如果您目前不能有特定原因,您会被告知。如果这是一个疏忽,他们应该以一种可能需要复制到其他环境等的受控方式进行纠正。

于 2014-12-16T19:59:41.860 回答
1

在 SSMS 中查看对象在 dev 和 prod 之间的差异似乎是由于您的用户帐户在 dev 和 prod 之间的权限差异。

为了查看表对象的默认值,您至少需要对该对象具有以下权限之一才能查看默认值:

ALTER on OBJECT or CONTROL on OBJECT 或者 TAKE OWNERSHIP on OBJECT 或者 VIEW DEFINITION on OBJECT

找到这个https://dba.stackexchange.com/questions/78769/minimum-sql-server-rights-that-allow-viewing-column-default-values

这似乎几乎可以回答您的问题:)

于 2014-12-16T19:22:41.427 回答