如何将Azure Synapse表上的授权和约束提取到可执行的SQL脚本中?

szqfcxe2  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(204)

我们在Azure Synapse数据库中有许多带有Round Robin分发的表。由于数据洗牌带来的性能问题,我们希望将其中一些表转换为HASH分布。

我们已经创建了完成此操作的步骤,其中包括创建一个具有散列分布的新表,然后对该新表执行CTAS,然后删除旧表并将新表重命名为旧表。表名必须与许多使用这些表的报表视图相同。

但这里的挑战是,CTAS在此过程中只复制数据,而不是GRANTSCONSTRAINTS

因此,我们希望将任何给定表的GRANTSCONSTRAINTS提取到.sql文件中,以便在创建新表之后。我们只需运行此SQL脚本并像以前一样准备好GRANTSCONSTRAINTS即可。

我可以通过下面的命令找出某个表上给出了什么GRANTS

EXEC sp_table_privileges @table_name = '<table_name>';

但是,无法以可执行的SQL脚本的形式提取这些信息。

有没有办法使用SSMS来实现这一点?这真的会对我们计划中的数据库修改有所帮助。你对如何做到这一点有什么想法吗?

8yparm6h

8yparm6h1#

您可以使用以下脚本生成所有权限

SELECT CONCAT(
    CASE WHEN p.state = 'W' THEN 'GRANT' ELSE p.state_desc END,
    ' ',
    p.permission_name,
    ' ON '
    QUOTENAME(s.name),
    '.',
    QUOTENAME(t.name),
    '(' + QUOTENAME(c.name) + ')',    -- The + feeds through nulls
    ' TO ',
    QUOTENAME(dp.name),
    CASE WHEN p.state = 'W' THEN ' WITH GRANT OPTION' END,
    ';'
  )
FROM sys.database_permissions p
JOIN sys.database_principals dp ON dp.principal_id = p.grantor_principal_id
JOIN sys.tables t ON t.object_id = p.major_id
JOIN sys.schemas s ON s.schema_id = t.schema_id
LEFT JOIN sys.columns c ON c.object_id = t.object_id
    AND c.column_id = p.minor_id
    AND p.minor_id <> 0
WHERE t.name = 'YourTable';

可以使用不同的系统视图以类似的方式完成约束,但不清楚您具体询问的是哪些约束。

相关问题