SQL Server 2017中如何直接修改系统目录?

Eva*_*oll 6 sql-server linux catalogs system-tables sql-server-2017

注意:我了解所涉及的风险,以及这样做可能会破坏生产系统。反正我有兴趣去做。

每当我尝试使用系统目录时,都会遇到这些奇怪的错误,

UPDATE sys.sql_logins
SET password_hash = PWDENCRYPT('pass')
WHERE name = 'sa';
Run Code Online (Sandbox Code Playgroud)

错误产生,

消息 259 [...]不允许对系统目录进行临时更新。

我尝试了很多方法来取下训练轮,

sp_configure 'allow updates',`
go
reconfigure
go
Run Code Online (Sandbox Code Playgroud)

但是,我想不出正确的选择......

它甚至在这个答案中说:

这不再可能(至少除了sp_configure选项之外,还需要跳过大量额外的箍- 这不是您想要在生产系统上做的事情),并且所有系统目录现在都通过只读视图公开像 sys.objects。

好吧,如果我想跳过这些箍怎么办。我该怎么做?

Sol*_*zky 10

!!   BE SURE TO READ THE WARNING, IN BOLD, AT THE BOTTOM   !!

的服务器配置选项allow updates在 SQL Server 2005 中开始不起作用。文档指出它没有错误,但实际上不允许对系统目录表进行任何直接更新。

现在实现这一目标的唯一方法是使用专用管理控制台 (DAC) 连接完全意识到这是危险的并且推荐

首先,您需要要更新的实际表名。您SELECT来自的名称只是一个系统目录视图,而不是真正的表。我通常使用以下方法:

EXEC sp_helptext N'sys.{some name here}';
Run Code Online (Sandbox Code Playgroud)

然后,执行以下操作:

  1. 在单用户模式下重新启动实例

    sudo systemctl stop mssql-server
    sudo -u mssql /opt/mssql/bin/sqlservr -m
    
    Run Code Online (Sandbox Code Playgroud)

    需要明确的是:这一步是为了允许系统目录更新。连接到 DAC 本身进行其他操作不需要单用户模式。

  2. 通过专用管理控制台连接sa或其他一些sysadmin登录进行连接。您可以通过在命令提示符窗口中运行以下命令在 SQLCMD 交互式会话中执行此操作:

    sqlcmd -S admin:localhost -U sa
    
    Run Code Online (Sandbox Code Playgroud)

    如果由于某种原因 Linux SQLCMD 不支持此功能,您可以启用远程 DAC 连接,然后使用 Windows 机器挖掘该 DAC 正在工作。您可以使用以下命令在 Linux 上启用 DAC:

    EXEC sp_helptext N'sys.{some name here}';
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在该数据库中,尝试如下操作:

    sudo systemctl stop mssql-server
    sudo -u mssql /opt/mssql/bin/sqlservr -m
    
    Run Code Online (Sandbox Code Playgroud)

    在您放入GO {enter}.

危险会罗宾逊!!

直接编辑系统目录表时请小心,不要太习惯这样做。只有在绝对没有其他解决问题的方法时才应该这样做(例如这里的情况)。避免直接编辑的原因可能有多种,但最初想到的两个原因是:

  • 与我们创建的数据模型非常相似,可能存在我们不知道的关于事物如何工作的规则和工作流(例如,非规范化、管理跨不同表的数据状态的“业务”规则等)
  • 如果您遇到问题并签订了支持合同(我没有看到支持协议的条款,但我很难相信这种语言不会出现在那里)。

    @Paul Randal在评论中确认:“手动编辑系统表不可撤销地在数据库的引导页面中设置了一个标志,将您的数据库标记为已以这种方式编辑过,如果您随后遇到问题,CSS 可能决定不帮助您用那个数据库。”