【问题标题】:Programmatically set the permissions on a table以编程方式设置表的权限
【发布时间】:2017-11-30 21:59:20
【问题描述】:

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

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

【问题讨论】:

  • 喜欢grant select on SomeTable to SomeUser?或者只是GRANT ALL,在桌子上是DELETE, INSERT, REFERENCES, SELECT, UPDATE
  • 具有特定权限的特定用户。
  • 真正的问题不在于设置权限——它是获取特定表上的现有权限。对吗?
  • 我想以编程方式设置新表的权限。我可以使用一个现有的表,该表具有我想要的新表作为模型的相同权限。假设我想创建一个与现有表完全相同的表。我可以右键单击表格并选择 Script Table as -> Create To,然后将出现可以准确创建该表格的代码。我想这样做,但有权限。

标签: sql sql-server sql-grant


【解决方案1】:

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

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

【讨论】:

  • 感谢这看起来是正确的地方。但是,当我下拉 Script 并选择 Script Action to New Query Window 时,我收到消息“没有要编写脚本的操作”。 Script 下的任何选择都会发生这种情况。我在左侧选择了 Permissions 页面,还选择了 Users or roles: 列表中的行,并且选择了 Permissions(在本例中为 Grant:Delete、Grant:Insert、Grant:Select 和 Grant :更新。
  • 那么你没有改变任何东西。第一个建议适用于您进行权限更改并希望查看将针对在特定时间点所做的更改执行的实际 tsql 脚本。
  • OIC,这很酷,我可以取消选中这些框,然后再次选中它们以查看脚本。
【解决方案2】:

评论太长了。

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

在这种情况下,由于它是一个表,&lt;n&gt; 可以是以下之一:

  • 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)

【讨论】:

  • 感谢您的努力,但这并不能回答问题。
  • 因此,您似乎想将过程的结果与游标和动态sql一起使用
猜你喜欢
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-29
  • 2012-08-04
相关资源
最近更新 更多