以编程方式设置表的权限

时间:2017-11-30 21:59:21

标签: sql sql-server grant

我想以编程方式在新创建的表上设置权限(即GRANT)。我希望让SQL Server通过转到数据库中的另一个表并进行右键单击然后"脚本表作为"来向我展示脚本。但是我没有看到GRANT的选项。

是否可以让SQL Server向我显示此脚本?

2 个答案:

答案 0 :(得分:1)

评论太久了。

GRANT <n> ON YourDatabase.YourSchema.YourTable TO YourSpecificUser

在这种情况下,因为它是一个表<n>可以是以下之一:

  • DELETE
  • INSERT
  • REFERENCES
  • SELECT
  • UPDATE

请注意,如果用户拥有fixed database role,则他们可以获得比您明确授予他们更多的访问权限。详细了解GRANT Object Permissions

值得注意的是,要返回表格上的权限列表,您可以使用sp_table_privileges

sp_table_privileges @table_name = 'YourTable'

您可以捕获这些结果,然后循环遍历它们以构建动态SQL查询。

将以下脚本替换为您的TableName以及您的NewTableName。如果您对打印输出感到满意,可以取消注释exec(@sql)以执行打印的代码。

if object_id('tempdb..#priv') is not null
drop table #priv

create table #priv( ID int identity (1,1)
                    ,TABLE_QUALIFIER varchar(64)
                    ,TABLE_OWNER VARCHAR(64)
                    ,TABLE_NAME VARCHAR(64)
                    ,GRANTOR VARCHAR(64)
                    ,GRANTEE VARCHAR(64)
                    ,PRIVILEGE VARCHAR(64)
                    ,IS_GRANTABLE VARCHAR(8))

insert into #priv
exec sp_table_privileges @table_name = 'YourTableName'

declare @i int = 1
declare @max int = (select max(id) from #priv)
declare @sql varchar(max) = ''

while (@i <= @max)
begin
    set @sql = @sql + (select ' GRANT ' + stuff(PRIVILEGE,1,0,' ') + ' ON ' + stuff(TABLE_NAME,1,0,' ') + ' TO ' + stuff(GRANTEE,1,0,' ') + char(13) + ' GO ' + char(13) from #priv where ID = @i)
    set @i = @i + 1
end

print(@sql)
set @sql = replace(@sql,'YourTableName','NewTableName')
print(@sql)
--exec(@sql)

答案 1 :(得分:1)

再看看。简单版本是使用您设置权限的对话框。例如,

enter image description here

更通用和更高级的方法 - 具有更多选项 - 是在数据库级别使用脚本功能。在您的数据库上,单击并选择,,然后运行向导以选择所需的表和脚本选项。确保单击脚本选项选项卡中的“高级”按钮 - 您将在其中看到&#34;对象级权限&#34; (默认情况下关闭)。