以编程方式设置 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"(默认情况下关闭)。
我想在新创建的 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"(默认情况下关闭)。