我有一个SQL Server表,其中有四列,其中一列是日期时间列,默认值为getdate()
。我有两个这个表的副本,一个在我完全控制的开发数据库服务器上,另一个在生产数据库服务器中,我几乎没有权限。
以下是开发表的外观:
我选择了dtInsert列。请注意,此列的默认值为getdate()
。我对此表的生产版本完全相同。当我向该表添加一行时,dtInsert单元格默认为getdate()
,就像我期望的那样。当数据库管理员生成生产表的脚本时,它包含默认值约束。但是,当我在SQL Server Management Studio 2012中查看表设计时,它会将列显示为没有默认值。见这里:
当我生成数据库图表时,它还会将dtInsert列显示为没有默认值。我再次通过测试得知生产数据库服务器中的dtinsert列确实默认为getdate()
。
这是SQL Server Management Studio 2012版中的错误吗?是否有一些我没有的权限会导致这种行为?还有别的吗?为什么列似乎没有默认值,即使它确实存在?
答案 0 :(得分:5)
这是SQL Server Management Studio 2012版中的错误吗?
没有
是否有一些我没有的权限会导致这种行为?
是
在对该问题的评论中,我建议运行以下内容:
SELECT *
FROM sys.default_constraints
WHERE [parent_object_id] = OBJECT_ID(N'_table_name_');
结果是生产中的行返回,其中[definition]
列为NULL
。这意味着DEFAULT CONSTRAINT存在,但您要么:
缺少明确且隐含的权限以查看定义
明确拒绝了查看该权限的许可。
您可以在MSDN页面上阅读Metadata Visibility Configuration。
现在,有各种权限(VIEW DEFINITION
,VIEW ANY DEFINITION
等)会影响此设置。这些可以在不同层面应用:
考虑多个Windows组中的成员资格(如果正在使用这些组),权限会变得更加复杂。
甚至可以在多个级别授予权限。权限也是附加的:您的Login所属的3个Windows组中的1个中的GRANT足以运行。但是,任何这些级别的DENY优先,在这种情况下,没有您的定义。
正如我在对该问题的评论中所提到的,这实际上是生产DBA的问题,他们配置了权限,使您无法看到定义。在没有确切知道为什么你看不到定义(缺少GRANT或存在DENY?)的情况下,发出尝试获得此权限的GRANT语句是无用的(特别是因为无法看到定义意味着你同样不会能够授予任何人这样的许可)。请与负责生产的人交谈,告诉他们您无法看到默认约束的定义,但您希望能够。如果有一个特定的原因,你目前不能,你会被告知。如果是疏忽,他们应该以受控的方式纠正它,可能需要复制到其他环境等。
答案 1 :(得分:1)
在dev和prod之间查看SSMS中的对象的差异似乎是由于dev和prod之间的用户帐户的权限差异。
要查看表对象的默认值,您需要在对象上至少具有以下权限之一才能查看默认值:
对象上的OBJECT或CONTROL上的ALTER或对象上的所有权 查看OBJECT上的定义
似乎几乎可以回答你的问题:)