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