AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 322561
Accepted
adam.g
adam.g
Asked: 2023-01-26 06:11:04 +0800 CST2023-01-26 06:11:04 +0800 CST 2023-01-26 06:11:04 +0800 CST

必须为 SQL 用户设置什么权限才能在数据库中配置更改跟踪?

  • 772

我正在构建应用程序,该应用程序必须具有配置(禁用/启用)特定数据库表上的更改跟踪的选项。我正在通过 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);
t-sql
  • 1 1 个回答
  • 33 Views

1 个回答

  • Voted
  1. Best Answer
    Zikato
    2023-01-27T12:40:46+08:002023-01-27T12:40:46+08:00

    最好的方法是结合尝试和阅读文档。

    我假设更改跟踪 (CT) 已在数据库级别启用。

    让我们在该数据库中创建一个新的登录名和用户(我正在使用 StackOverflow)

    CREATE LOGIN BillyNoRights WITH PASSWORD = '$tr0ngPassword'
    GO
    USE [StackOverflow]
    GO 
    CREATE USER BillyNoRights FROM LOGIN BillyNoRights
    

    然后您可以模拟登录并运行您的查询。

    EXECUTE AS LOGIN = 'BillyNoRights'
    SELECT DISTINCT
           sct1.name  
    …
    

    给你一个错误:

    消息 262,级别 14,状态 1,第 9 行
    VIEW DATABASE STATE 权限在数据库“StackOverflow”中被拒绝。
    消息 297,级别 16,状态 1,第 9 行
    用户无权执行此操作。

    (这适用于 SQL 2019 及更早版本。SQL 2022 的权限为VIEW DATABASE PERFORMANCE STATE)

    如果您授予此权限(来自非模拟的不同会话),您可以运行查询。

    GRANT VIEW DATABASE STATE TO BillyNoRights
    

    第二部分是关于在任何表上启用更改跟踪。您没有为此提供代码,但语法很简单

    ALTER TABLE dbo.Votes
    ENABLE CHANGE_TRACKING
    

    这次,错误不是那么有用

    消息 1088,级别 16,状态 13,第 40 行
    找不到对象“投票”,因为它不存在或您没有权限。

    我们得看看Alter Table语句的文档

    需要对表的 ALTER 权限。

    我们可以授予对表的精细权限,但由于您希望能够在任何表(甚至可能是未来的表)上启用 CT,我们必须降低粒度。

    我能找到的最接近的数据库级权限是

    GRANT ALTER ANY SCHEMA TO BillyNoRights
    

    这有效,但它授予用户对ALTER任何对象(过程、函数等)的权限

    所以我会推荐一个动态 SQL 包装在一个存储过程中,以表名作为参数。

    如何在没有 SQL 注入的情况下正确地执行此操作超出了这个问题的范围,所以我会向您指出Erland Sommarskog 的存储过程中的打包权限

    • 3

相关问题

  • 如何使用 TSQL 更改 SQL 服务器配置管理器设置?

  • 如何从结果集中获取列名和类型的列表?

  • MS SQL:使用计算值计算其他值

  • 如何判断 SQL Server 数据库是否仍在使用?

  • 实施 PIVOT 查询

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve