mus*_*fan 6 sql-server-2008 sql-server
我有一个 SQL Server 2008 数据库,某些表中的某些字段(列)配置了默认值。
我要求尽可能地限制用户安全,理想情况下只允许读/写权限。然而,用户需要能够看到列的默认值是什么(它实际上是一个需要读取默认值的应用程序)。
通常,如果我只想读/写,我可以授予用户对以下角色的访问权限:
db_datareader
db_datawriter
问题是这会阻止访问默认值。这可以通过打开一个表设计视图来确认(他们收到一条消息,说他们的访问权限有限,只能查看表设计),并且默认值只是显示为空白。
如果我添加db_owner
角色,那么他们可以很好地查看默认值,但我不想赋予所有者权力。
我还能做些什么来限制只能读/写但具有查看默认值的额外能力?
这将允许默认值显示在表设计器的下部窗格中:
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)
归档时间: |
|
查看次数: |
1232 次 |
最近记录: |