我正在构建应用程序,该应用程序必须具有配置(禁用/启用)特定数据库表上的更改跟踪的选项。我正在通过 SQL 用户连接到数据库。需要为 SQL 用户添加哪些数据库权限以禁用/启用对表的更改跟踪和运行以下查询的选项:
SELECT DISTINCT
sct1.name AS CT_schema
, sot1.name AS CT_table
, ps1.row_count AS CT_rows
, sct2.name AS tracked_schema
, sot2.name AS tracked_name
, CHANGE_TRACKING_MIN_VALID_VERSION(sot2.object_id) AS min_valid_version
, itt.create_date AS change_tracking_table_creation_date
, CAST(ps1.reserved_page_count * 8. / 1024 AS BIGINT) AS CT_reserved_MB
, CAST(ps2.reserved_page_count * 8. / 1024 AS BIGINT) AS tracked_base_table_MB
, ps2.row_count AS tracked_rows
FROM sys.internal_tables it
JOIN sys.objects sot1
ON it.object_id = sot1.object_id
JOIN sys.schemas AS sct1
ON sot1.schema_id = sct1.schema_id
JOIN sys.dm_db_partition_stats ps1
ON it.object_id = ps1.object_id
AND ps1.index_id IN (0, 1)
LEFT JOIN sys.objects sot2
ON it.parent_object_id = sot2.object_id
LEFT JOIN sys.schemas AS sct2
ON sot2.schema_id = sct2.schema_id
LEFT JOIN sys.dm_db_partition_stats ps2
ON sot2.object_id = ps2.object_id
AND ps2.index_id IN (0, 1)
INNER JOIN sys.internal_tables itt
ON itt.name = sot1.name
WHERE it.internal_type IN (209, 210);
最好的方法是结合尝试和阅读文档。
我假设更改跟踪 (CT) 已在数据库级别启用。
让我们在该数据库中创建一个新的登录名和用户(我正在使用 StackOverflow)
然后您可以模拟登录并运行您的查询。
给你一个错误:
(这适用于 SQL 2019 及更早版本。SQL 2022 的权限为
VIEW DATABASE PERFORMANCE STATE
)如果您授予此权限(来自非模拟的不同会话),您可以运行查询。
第二部分是关于在任何表上启用更改跟踪。您没有为此提供代码,但语法很简单
这次,错误不是那么有用
我们得看看Alter Table语句的文档
我们可以授予对表的精细权限,但由于您希望能够在任何表(甚至可能是未来的表)上启用 CT,我们必须降低粒度。
我能找到的最接近的数据库级权限是
这有效,但它授予用户对
ALTER
任何对象(过程、函数等)的权限所以我会推荐一个动态 SQL 包装在一个存储过程中,以表名作为参数。
如何在没有 SQL 注入的情况下正确地执行此操作超出了这个问题的范围,所以我会向您指出Erland Sommarskog 的存储过程中的打包权限