数据库
首页 > 数据库> > sql-server – 如何在SQL Server 2017中直接修改系统目录?

sql-server – 如何在SQL Server 2017中直接修改系统目录?

作者:互联网

注意:我了解所涉及的风险,以及通过这样做破坏生产系统的可能性.无论如何,我有兴趣这样做.

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

UPDATE sys.sql_logins
SET password_hash = PWDENCRYPT('pass')
WHERE name = 'sa';

产生错误,

Msg 259 […] Ad hoc updates to system catalogs are not allowed.

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

sp_configure 'allow updates',`
go
reconfigure
go

但是,我无法弄清楚正确的选择……

它甚至在this answer中说:

this is no longer possible (at least not without jumping through a ton of additional hoops beyond just an sp_configure option – it’s not something you ever want to do on a production system), and all of the system catalog is now exposed through read-only views like sys.objects.

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

解决方法:

!务必阅读警告,大胆,在底部!

允许更新的服务器配置选项在SQL Server 2005中开始呈现为无效.文档指出它不会出错,但实际上不允许对系统目录表进行任何直接更新.

现在实现这一目标的唯一方法是,完全知道这是危险的,并且不推荐使用Dedicated Admin Console (DAC) connection.

首先,您需要要更新的实际表名.您从中选择的名称只是一个系统目录View,而不是真正的Table.我通常使用以下内容:

EXEC sp_helptext N'sys.{some name here}';

然后,执行以下操作:

>使用以单用户模式重新启动实例

sudo systemctl stop mssql-server
sudo -u mssql /opt/mssql/bin/sqlservr -m

需要明确的是:此步骤允许系统目录更新.连接到DAC本身以执行其他操作不需要单用户模式.
>通过专用管理控制台连接与sa或其他一些sysadmin登录连接.您可以通过在命令提示符窗口中运行以下命令在SQLCMD交互式会话中执行此操作:

sqlcmd -S admin:localhost -U sa

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

EXEC sp_configure 'remote admin connections', 1;  
RECONFIGURE;  

>在该DB中,尝试以下内容:

UPDATE sys.{whatever_name_you_found} {enter}
SET [some_column] = {some_value} {enter}
WHERE [some_other_column] = {the_better_be_correct_or_else_ID}; {enter}
GO {enter}

在您输入GO {enter}之前,它不会执行该语句.

危险将罗宾逊!

直接编辑系统目录表时请务必小心,并且不要过于习惯这样做.只有在绝对没有其他方法来解决问题时(例如此处的情况),才应该这样做.避免直接编辑可能有几个原因,但最初想到的两个原因是:

>就像我们创建的数据模型一样,可能存在规则和工作流程,以确定我们不知道的工作方式(例如,非规范化,管理各种表格中数据状态的“业务”规则等)
>如果遇到问题并签订支持合同(我还没有看到支持协议的条款,但我很难相信这样的语言不会出现),微软很可能会做出直接修改而无法帮助你.在那里).

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

标签:sql-server-2017,sql-server,linux,system-tables,catalogs
来源: https://codeday.me/bug/20190805/1591663.html