以编程方式设置 table 的权限

Programmatically set the permissions on a table

我想在新创建的 table 上以编程方式设置权限(即 GRANT)。我希望通过转到数据库中的另一个 table 并右键单击然后 "Script Table as" 让 SQL 服务器向我显示脚本,但我没有看到下面的 GRANT 选项。

是否可以让 SQL 服务器向我显示此脚本?

评论时间太长。

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

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

  • DELETE
  • INSERT
  • REFERENCES
  • SELECT
  • UPDATE

请注意,如果用户有 fixed database role, they could have more access than you explicitly grant them. Read more about GRANT Object Permissions

值得注意的是,要return一个table的权限列表,你可以使用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)

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

一种更通用和更高级的方法(具有更多选项)是在数据库级别使用脚本功能。在您的数据库上,单击 select ,然后 运行 通过向导 select 您的 table 和您想要的脚本选项。请务必单击脚本选项选项卡中的高级按钮 - 您将在其中看到 "object-level permissions"(默认情况下关闭)。