use*_*861 3 sql-server default-value ssms-2012
我有一个SQL Server表,其中有四列,其中一列是datetime列,默认值为getdate().我有两个这个表的副本,一个在我完全控制的开发数据库服务器中,另一个在生产数据库服务器中,我几乎没有权限.
以下是开发表的外观:

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

当我生成数据库图表时,它还会将dtInsert列显示为没有默认值.同样,我从测试中知道我的生产数据库服务器中的dtinsert列确实默认为getdate().
这是SQL Server Management Studio 2012版中的错误吗?是否有一些我没有的权限会导致这种行为?还有别的吗?为什么列看起来没有默认值,即使它确实如此?
这是SQL Server Management Studio 2012版中的错误吗?
没有.
是否有一些我没有的权限会导致这种行为?
是.
在对该问题的评论中,我建议运行以下内容:
SELECT *
FROM sys.default_constraints
WHERE [parent_object_id] = OBJECT_ID(N'_table_name_');
Run Code Online (Sandbox Code Playgroud)
结果是生产中的行返回,其中[definition]列为NULL.这意味着DEFAULT CONSTRAINT存在,但您要么:
缺乏明确和隐含的权限来查看定义
已明确拒绝允许查看它.
您可以在MSDN页面上阅读有关元数据可见性配置的信息.
现在,有不同的权限(VIEW DEFINITION,VIEW ANY DEFINITION,等)影响此设置.这些可以应用于各种级别:
考虑多个Windows组中的成员身份(如果正在使用这些组),权限会变得更加复杂.
甚至可以在多个级别授予权限.权限也是附加的:您的Login所属的3个Windows组中的1个中的GRANT足以运行.但是,任何这些级别的DENY优先,在这种情况下,没有您的定义.
正如我在对该问题的评论中提到的,这对于配置权限以使您无法看到定义的生产DBA来说真的很重要.在没有确切知道为什么你看不到定义(缺少GRANT或存在DENY?)的情况下,发出尝试获得此权限的GRANT语句是无用的(特别是因为无法看到定义意味着你同样不会能够授予任何人这样的许可).请与负责生产的人交谈,告诉他们您无法看到默认约束的定义,但您希望能够.如果有一个特定的原因,你目前不能,你会被告知.如果是疏忽,他们应该以受控的方式纠正它,可能需要复制到其他环境等.
| 归档时间: |
|
| 查看次数: |
1476 次 |
| 最近记录: |