(A.)以下是表格测试中“d_no”列的条件。在这里你可以看到它是一个计算列,它的定义是NULL。所以我想知道这种情况如何生成?我无法创建具有NULL定义的计算列。
表名:test
列名:d_no
is_nullable:1
定义:NULL
is_computed:1
此案例适用于SQL Server 2012(11.0.6523)版本。
(B.)场景: 有“User1”是真正的数据库所有者(自己的数据库)。还有另一个用户“User2”。 User2具有访问User1数据库的一些权限,如SELECT或get DDL。 当我使用User2登录并尝试获取具有列为计算列的表的CREATE查询时。对于该表,我们没有在结果查询中获得计算列定义。 我们得到xyz(numeric(18,0)null)
那么是否可能出现同样的权限问题,在之前的情况(A)中可能会导致null?
答案 0 :(得分:2)
您无法获得null定义。即使将计算列创建为null,也不会将定义更改为null ..
create table dbo.t4
(
id int null,
idplus as cast(null as int)
)
select definition
from sys.computed_columns
输出
(CONVERT([int],NULL,0))
由于权限问题,您看到NULL
定义..
以下是关于此事的what MSDN has to say ..
查看数据库对象的Transact-SQL源代码的规则比查看元数据更严格。
要查看对象的Transact-SQL定义, 用户必须拥有该对象或已被授予该对象的以下权限之一 :
CONTROL
ALTER
取得所有权
查看定义
以下视图的情况也是如此,如果您没有权限,则定义将为null ..
答案 1 :(得分:0)
a)如果用户不是myTable的表所有者,并且仅被授予对表的SELECT权限,则当用户访问以下目录视图时,定义列为NULL。
意味着用户只有选择(datareader)权限而不是dbowner。然后使用该用户登录并检查计算列的定义。
选择定义
来自sys.computed_columns
它在定义字段中为您提供NULL值。
b)如果要在上述同一用户的定义字段中获取计算列的定义,谁只具有SELECT权限,则为特定对象授予VIEW DEFINITION权限(具有计算列的表) 通过用户。
然后再次使用该用户登录并运行查询以查看定义值。那个时候它会在定义字段中显示计算列的实际定义。