【发布时间】: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 USER或DROP USER来执行此类操作 - 执行此操作时系统目录视图将自动更新 -
同意@marc_s - 请使用文档化和支持的方法来实现安全性。
标签: sql-server-2008