允许查看列默认值的最低 SQL Server 权限

mus*_*fan 6 sql-server-2008 sql-server

我有一个 SQL Server 2008 数据库,某些表中的某些字段(列)配置了默认值。

我要求尽可能地限制用户安全,理想情况下只允许读/写权限。然而,用户需要能够看到列的默认值是什么(它实际上是一个需要读取默认值的应用程序)。

通常,如果我只想读/写,我可以授予用户对以下角色的访问权限:

  • db_datareader
  • db_datawriter

问题是这会阻止访问默认值。这可以通过打开一个表设计视图来确认(他们收到一条消息,说他们的访问权限有限,只能查看表设计),并且默认值只是显示为空白。

如果我添加db_owner角色,那么他们可以很好地查看默认值,但我不想赋予所有者权力。

我还能做些什么来限制只能读/写但具有查看默认值的额外能力?

Aar*_*and 8

这将允许默认值显示在表设计器的下部窗格中:

GRANT VIEW DEFINITION ON dbo.tablename TO [username];
Run Code Online (Sandbox Code Playgroud)

当然,这并不能让他们对表格进行任何更改,而且总的来说我不鼓励使用设计器。他们充满了错误和不一致。有了VIEW DEFINITION权限,您的用户还可以从目录视图中提取此信息:

SELECT 
  [constraint] = d.name, 
  [column] = c.name, 
  [default] = d.definition 
FROM sys.default_constraints AS d
  INNER JOIN sys.tables AS t
  ON d.parent_object_id = t.[object_id]
  INNER JOIN sys.schemas AS s
  ON s.[schema_id] = t.[schema_id]
  INNER JOIN sys.columns AS c
  ON t.[object_id] = c.[object_id]
  AND d.parent_column_id = c.column_id
  WHERE s.name = N'dbo'
    AND t.name = N'tablename';
Run Code Online (Sandbox Code Playgroud)

有没有办法对整个数据库表做类似的事情?我的意思是,关于GRANT VIEW DEFINITION ON dbo.tablename TO [username];.

当然,动态 SQL 在这里非常方便。

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += N''GRANT VIEW DEFINITION ON ' 
  + QUOTENAME(s.name) + N'.' + QUOTENAME(t.name)
  + N' TO [username];' + CHAR(13) + CHAR(10)
FROM sys.schemas AS s
INNER JOIN sys.tables AS t
ON s.[schema_id] = t.[schema_id];

PRINT @sql;
-- EXEC sys.sp_executesql @sql;
Run Code Online (Sandbox Code Playgroud)