【问题标题】:SQL Server 2008 - Update system catalog from stored procedureSQL Server 2008 - 从存储过程更新系统目录
【发布时间】:2011-10-15 10:13:02
【问题描述】:

我们在 SQL Server 2000 中有一些旧的存储过程,它们从用于用户应用程序安全的应用程序更新系统目录,该应用程序与 SQL Server 角色相关联,以利用 SQL Server 内置安全性和 NT 登录。

当我们将数据库迁移到 SQL Server 2008 并尝试运行这些存储过程时,我们得到 SQL Server 2008 错误

不允许对系统目录进行临时更新。

我四处搜索,发现从 SQL Server 2005 开始,MS 不支持目录更新(除非使用专用管理员连接 (DAC))。

如果有人可以帮助我在新版本或任何其他替代方案中执行此操作(例如在 Sql 服务器中运行的 .Net 代码??),那就太好了。

下面的一些示例查询

update sysusers 
set roles = convert(varbinary(2048), substring(convert(binary(2048), roles), 1, @ruidbyte-1)
            + convert(binary(1), (~@ruidbit) & substring(convert(binary(2048), roles), @ruidbyte, 1)) 
            + substring(convert(binary(2048), roles), @ruidbyte+1, 2048-@ruidbyte)), 
   updatedate = getdate()
where uid = @memuid

delete from syspermissions where grantee = @uid

delete from sysusers where uid = @uid

insert into sysusers 
values(@uid, 0, @rolename, NULL, 0x00, getdate(), getdate(), @owner, NULL)

【问题讨论】:

  • 基本上,那些系统目录视图(在 SQL Server 2005/2008 和更高版本中)就是这样 - 系统表的只读视图。这些系统表不能通过常规代码编辑——T-SQL 和 SQL-CLR 都不是。您需要使用“官方”、已发布的 API,如 CREATE USERDROP USER 来执行此类操作 - 执行此操作时系统目录视图将自动更新
  • 同意@marc_s - 请使用文档化和支持的方法来实现安全性。

标签: sql-server-2008


【解决方案1】:

在 SQL Server 中更新系统表没有常规原因。永远。

有一整套命令和系统存储过程可以在所有版本的 SQL Server 中正确执行。

正如您所说,您无论如何都不能:没有破解或解决方法

【讨论】:

  • 感谢您提供详细信息。什么将是一些等效的系统存储过程来执行以下从 syspermissions 删除 where grantee = #uid delete from sysusers where uid = #uid insert into sysusers values(#uid, 0, #rolename, NULL, 0x00, getdate(), getdate (), #owner, NULL)
  • 删除用户并创建用户(仅搜索)。也删除用户删除权限
  • 不使用 sp_addrolemember 系统存储过程的原因允许非 dbo_ 用户安全地访问和执行 sp_addrolemember 的修订副本。 SQL 2008 中是否仍然存在该限制?
  • 如果您将 sp_addrolemember 包装在另一个存储过程中,您可以使用 EXECUTE AS OWNER(我假设是 dbo)来升级 proc 范围的权限以执行您所需的所有操作。这是 SQL Server 2005+ 中的新功能msdn.microsoft.com/en-us/library/ms178106.aspx
  • 谢谢。我认为这可能对我有帮助。
【解决方案2】:

更新系统表可能是一项危险的任务,因为它可能会导致意外结果。因此,在您这样做之前,请确保您对所做的任何事情都非常有信心。建议您对原始数据库的副本进行更改,以防止数据库中出现不需要的结果或崩溃。

可能的方法是:

  1. 使用 DAC。你可以在谷歌上搜索后获得该技术。更多的是破解系统表。

  2. 使用以下代码:

sp_configure '允许更新',1 去

//你的代码

重新配置覆盖 去

reconfigure 将重新配置您的数据库。 将 'allow updates' 设置为 '1' 将允许您更新系统表。

但最好的方法是为您的任务找到另一个替代方案。!

【讨论】:

    猜你喜欢
    • 2013-06-09
    • 2011-03-12
    • 2015-01-26
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多