我有一个包含四列的 SQL Server 表,其中一列是默认值为 getdate()
的日期时间列。我有此表的两个副本,一个在我可以完全控制的开发数据库服务器中,另一个在我几乎没有权限的生产数据库服务器中。
下面是开发表的样子:
我选择了 dtInsert 列。请注意,此列的默认值为 getdate()
。我拥有的这张表的生产版本完全相同。当我向该表中添加一行时,dtInsert 单元格默认为 getdate()
,就像我期望的那样。当数据库管理员生成生产表的脚本时,它包括默认值约束。但是,当我在 SQL Server Management Studio 2012 中查看表设计时,它显示该列没有默认值。看这里:
当我生成数据库图时,它还显示 dtInsert 列没有默认值。同样,我通过测试知道我的生产数据库服务器中的 dtinsert 列确实默认为 getdate()
。
这是 SQL Server Management Studio 2012 版中的错误吗?是否有一些我没有的许可导致了这种行为?是别的东西吗?为什么该列似乎没有默认值,即使它有默认值?
最佳答案
Is this a bug in SQL Server Management Studio version 2012?
没有。
Is there some permission I don't have which brings about this behavior?
是的。
在对问题的评论中,我建议运行以下命令:
SELECT *
FROM sys.default_constraints
WHERE [parent_object_id] = OBJECT_ID(N'_table_name_');
结果是在 Production 中返回了一行,其中 [definition]
列为 NULL
。这意味着 DEFAULT CONSTRAINT 存在,但您可以:
缺乏查看定义的明确和隐含权限
已被明确拒绝查看它的权限。
您可以在 Metadata Visibility Configuration 的 MSDN 页面上阅读相关内容.
现在,有各种权限(VIEW DEFINITION
、VIEW ANY DEFINITION
等)会影响此设置。这些可以应用于各个级别:
- 对象本身
- 架构
- 数据库
- 等等
考虑到多个 Windows 组(如果正在使用)的成员身份时,权限会变得更加复杂。
甚至可以在多个级别授予权限。权限也是可加的:在您的登录名所属的 3 个 Windows 组中的 1 个中授予 GRANT 就足够了。但是,任何这些级别中的 DENY 优先,在这种情况下,您没有任何定义。
正如我在对该问题的评论中提到的,这实际上是生产 DBA 的问题,他们配置了权限,因此您看不到定义。不知道为什么你看不到定义(缺少 GRANT 或存在 DENY?)发出 GRANT 语句试图获得此权限是没有用的(特别是因为看不到定义意味着你同样不会能够向任何人授予此类许可)。请与负责生产的人交谈,告诉他们您看不到默认约束的定义,但您希望能够看到。如果有具体原因导致您目前不能,您会被告知。如果这是一个疏忽,他们应该以可控的方式纠正它,可能需要将其复制到其他环境等。
关于sql-server - 为什么我的 SQL Server 列似乎没有默认值,即使它像它一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27511591/