如何快速回复用户权限

renzhm 2009-04-24 10:21:45
我发布了几个订阅服务器,但没有建立登录账号和用户,如何把生产机上的登录账号和用户,以及权限移植到订阅服务器上?

有没有一个办法,在生产机上把某个用户的权限生成一个脚本,拿到订阅服务器上执行?如果为每个对象重新分配权限,太耗时了,也不安全!
...全文
165 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
nzperfect 2009-04-24
  • 打赏
  • 举报
回复
--生成用户的语句
select 'create USER ['+ name+'] FOR login ['+name+'] WITH DEFAULT_SCHEMA =dbo'
from sysusers where uid<>1 and (uid<16384 or uid>16393)
AND name not in ('sys','public','guest','sa','dbo','INFORMATION_SCHEMA','login_user')
and name not like 'MSReplPAL%'
and name not like 'MStran%'
and name not like 'aspnet_%'
go

--删除用户的语句
select
case when (select count(*) from sys.schemas where name=s.name)>0 then
'drop schema ['+ name+']; drop user ['+name+'];'
else 'drop user ['+name+'];'end
from sysusers as s where uid<>1 and (uid<16384 or uid>16393)
AND name not in ('sys','public','guest','sa','dbo','INFORMATION_SCHEMA')
and name not like 'MSReplPAL%'
and name not like 'MStran%'
nzperfect 2009-04-24
  • 打赏
  • 举报
回复
生成权限脚本:
select 
case a.protecttype when 204 then 'GRANT_W_GRANT' when 205 then 'GRANT'
when 206 then 'REVOKE' end /*as [protect_mode]*/+' '+
case a.action when 26 then 'REFERENCES' when 178 then 'CREATE FUNCTION'
when 193 then 'SELECT' when 195 then 'INSERT' when 196 then 'DELETE'
when 197 then 'UPDATE' when 198 then 'CREATE TABLE' when 203 then 'CREATE DATABASE'
when 207 then 'CREATE VIEW' when 222 then 'CREATE PROCEDURE' when 224 then 'EXECUTE'
when 228 then 'BACKUP DATABASE' when 233 then 'CREATE DEFAULT'
when 235 then 'BACKUP LOG' when 236 then 'CREATE RULE' end /*as [action_type]*/
+' ON ['+d.name /*as [object_owner]*/+'].['+b.name /*as [object_name]*/+']'
+' TO ['+c.name /*as [user_name]*/+']' as [protect_sql]
from sysprotects a (nolock)
join sysobjects b (nolock)
on a.id=b.id
join sysusers c (nolock)
on a.uid=c.uid
join sysusers d (nolock)
on b.uid=d.uid
where b.status>=0 and b.xtype in ('FN','IF','P','RF','TF','U','V','X')
and c.uid<>1 and (c.uid<16384 or c.uid>16393) and b.name not like '%!%'
and b.category!=2

nzperfect 2009-04-24
  • 打赏
  • 举报
回复
同步用户名和密码及sid:

下面代码在源数据库的master中执行,会新建两个存储过程,

这两个存储过程建立好后,执行存储过程EXEC master..sp_help_revlogin

在查询结果中生成的代码粘到目的机器中执行。就可以同步用户名和密码了。

/*
在源服务器上执行:EXEC master..sp_help_revlogin test
将上述输出进行编辑后在目标服务器上执行;
将源服务器上的用户所属组和权限同步到目标服务器上;
*/

----- Begin Script, Create sp_help_revlogin procedure -----

USE master
GO
IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
DROP PROCEDURE sp_hexadecimal
GO
CREATE PROCEDURE sp_hexadecimal
@binvalue varbinary(256),
@hexvalue varchar(256) OUTPUT
AS
DECLARE @charvalue varchar(256)
DECLARE @i int
DECLARE @length int
DECLARE @hexstring char(16)
SELECT @charvalue = '0x'
SELECT @i = 1
SELECT @length = DATALENGTH (@binvalue)
SELECT @hexstring = '0123456789ABCDEF'
WHILE (@i <= @length)
BEGIN
DECLARE @tempint int
DECLARE @firstint int
DECLARE @secondint int
SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))
SELECT @firstint = FLOOR(@tempint/16)
SELECT @secondint = @tempint - (@firstint*16)
SELECT @charvalue = @charvalue +
SUBSTRING(@hexstring, @firstint+1, 1) +
SUBSTRING(@hexstring, @secondint+1, 1)
SELECT @i = @i + 1
END
SELECT @hexvalue = @charvalue
GO

IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
DROP PROCEDURE sp_help_revlogin
GO
CREATE PROCEDURE sp_help_revlogin
@login_name sysname = NULL
AS
DECLARE @name sysname,@dbname sysname
DECLARE @binpwd varbinary (256)
DECLARE @txtpwd sysname
DECLARE @tmpstr varchar (256)
DECLARE @SID_varbinary varbinary(85)
DECLARE @SID_string varchar(256)

IF (@login_name IS NULL)
DECLARE login_curs CURSOR FOR
-- SELECT a.sid, a.name as login, password,b.name as dbname FROM master..sysxlogins a join master..sysdatabases b
select sid,name,password_hash,default_database_name from sys.sql_logins
WHERE name <> 'sa'
ELSE
DECLARE login_curs CURSOR FOR
select sid,name,password_hash,default_database_name from sys.sql_logins
WHERE name = @login_name
OPEN login_curs
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @binpwd,@dbname
IF (@@fetch_status = -1)
BEGIN
PRINT 'No login(s) found.'
CLOSE login_curs
DEALLOCATE login_curs
RETURN -1
END
SET @tmpstr = '/* sp_help_revlogin script '
PRINT @tmpstr
SET @tmpstr = '** Generated '
+ CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
PRINT @tmpstr
PRINT ''
PRINT 'DECLARE @pwd sysname'
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
PRINT ''
SET @tmpstr = '-- Login: ' + @name
PRINT @tmpstr

IF (@binpwd IS NOT NULL)
BEGIN -- Non-null password
EXEC sp_hexadecimal @binpwd, @txtpwd OUT
-- IF (@xstatus & 2048) = 2048
-- SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'

SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
PRINT @tmpstr
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', @pwd, @sid = ' + @SID_string + ',@defdb = '''+@dbname+''', @encryptopt = '
END
ELSE
BEGIN
-- Null password
EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name
+ ''', NULL, @sid = ' + @SID_string + ',@defdb = '''+@dbname+''', @encryptopt = '
END

SET @tmpstr = @tmpstr + '''skip_encryption'''
PRINT @tmpstr

END
FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @binpwd,@dbname
END
CLOSE login_curs
DEALLOCATE login_curs
RETURN 0
GO
----- End Script -----
renzhm 2009-04-24
  • 打赏
  • 举报
回复
sql2005
  • 打赏
  • 举报
回复
关注MM大叔
nzperfect 2009-04-24
  • 打赏
  • 举报
回复
sql 2005 ?还是sql 2000?
renzhm 2009-04-24
  • 打赏
  • 举报
回复
楼上老大,如何导出权限脚本,我现在要的就是这个
nzperfect 2009-04-24
  • 打赏
  • 举报
回复
如果帐号权限是数据库级的,很简单,只同步login帐号就可以.
如果帐号权限到表级,那么要导出权限脚本到订阅去执行.
renzhm 2009-04-24
  • 打赏
  • 举报
回复
用恢复的方法,只是会造成用户孤立,这个好解决,我当时做订阅服务器时,用的是空数据库,除了用户和权限,其他数据库对象都已经同步了
lg3605119 2009-04-24
  • 打赏
  • 举报
回复
帮顶
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
再不行就只能帮顶了.
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
我们公司有两个服务器,一个为正式使用,一个为测试用途,当从正式环境恢复到测试环境的时候,会出现原来用户无法访问的问题。但当你想加上原来用户的权限,系统会提示已经存在。但你并不没有看见,这个时候应该怎么办呢?
我们的组长提供了以下这个方法,

新建一个存储过程

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO

CREATE PROCEDURE [sz_dvp_restore_login_user]
--INPUT
@DBName nvarchar(50),
@UserName nvarchar(50)
AS
Exec sp_configure 'allow updates',1
RECONFIGURE WITH OVERRIDE

Declare @ExecStr nvarchar(4000)

Select @ExecStr ='Declare @b varbinary(85) ' +
'Use Master '
+ 'Select @b = sid From syslogins Where Name =''' + @UserName + ''''
+ ' Use ' + @DBName
+ ' Update sysusers Set sid = @b Where name =''' + @UserName + ''''

--Print @ExecStr
Exec(@ExecStr)

Exec sp_configure 'allow updates',0
RECONFIGURE WITH OVERRIDE
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
http://www.phpchina.com/html/83/83_itemid_28969.html
youqi1984 2009-04-24
  • 打赏
  • 举报
回复
只有顶的份了
claro 2009-04-24
  • 打赏
  • 举报
回复
帮顶
win的 powershell不知能否实现。
Andy__Huang 2009-04-24
  • 打赏
  • 举报
回复
一般先把旧用户权限等信息删除,然后再建立用户\授权等,这样做比较保险,保证数据库访问不会出错
完成这个操作一般在企业管理器里完成

使用命令还要知道参数的使用,心理上觉得不是那么保险?
ws_hgo 2009-04-24
  • 打赏
  • 举报
回复
关注
renzhm 2009-04-24
  • 打赏
  • 举报
回复
楼上方法是创建时有用,我现在有比较复杂的用户权限,而且对象繁多,不想去写脚本,而是想从生产机上的权限备份出来,恢复到订阅服务器上
htl258_Tony 2009-04-24
  • 打赏
  • 举报
回复
/*--示例说明
示例在数据库pubs中创建一个拥有表jobs的所有权限、拥有表titles的SELECT权限的角色r_test
随后创建了一个登录l_test,然后在数据库pubs中为登录l_test创建了用户账户u_test
同时将用户账户u_test添加到角色r_test中,使其通过权限继承获取了与角色r_test一样的权限
最后使用DENY语句拒绝了用户账户u_test对表titles的SELECT权限。
经过这样的处理,使用l_test登录SQL Server实例后,它只具有表jobs的所有权限。
--*/

USE pubs

--创建角色 r_test
EXEC sp_addrole 'r_test'

--授予 r_test 对 jobs 表的所有权限
GRANT ALL ON jobs TO r_test
--授予角色 r_test 对 titles 表的 SELECT 权限
GRANT SELECT ON titles TO r_test

--添加登录 l_test,设置密码为pwd,默认数据库为pubs
EXEC sp_addlogin 'l_test','pwd','pubs'

--为登录 l_test 在数据库 pubs 中添加安全账户 u_test
EXEC sp_grantdbaccess 'l_test','u_test'

--添加 u_test 为角色 r_test 的成员
EXEC sp_addrolemember 'r_test','u_test'

--拒绝安全账户 u_test 对 titles 表的 SELECT 权限
DENY SELECT ON titles TO u_test

/*--完成上述步骤后,用 l_test 登录,可以对jobs表进行所有操作,但无法对titles表查询,虽然角色 r_test 有titles表的select权限,但已经在安全账户中明确拒绝了对titles的select权限,所以l_test无titles表的select权限--*/

--从数据库 pubs 中删除安全账户
EXEC sp_revokedbaccess 'u_test'

--删除登录 l_test
EXEC sp_droplogin 'l_test'

--删除角色 r_test
EXEC sp_droprole 'r_test'
王向飞 2009-04-24
  • 打赏
  • 举报
回复
学习了 谢谢
renzhm 2009-04-24
  • 打赏
  • 举报
回复
非常感谢perfectaction ,太帅了
针对 OA 系统的特点,权限说明: 权限 在系统中,权限通过模块 +动作来产生,模块就是整个系统中的一个子模块,可能对应一个 菜单,动作也就是整个模块中(在B/S 系统中也就是一个页面的所有操作,比如“ 浏览、添 加、修改、删除” 等)。将模块与之组合可以产生此模块下的所有权限。 权限组 为了更方便的权限的管理,另将一个模块下的所有权限组合一起,组成一个“ 权限组” ,也就 是一个模块管理权限,包括所有基本权限操作。比如一个权限组(用户管理),包括用户的 浏览、添加、删除、修改、审核等操作权限,一个权限组也是一个权限。 角色 权限的集合,角色与角色之间属于平级关系,可以将基本权限或权限组添加到一个角色中, 用于方便权限的分配。 用户组 将某一类型的人、具有相同特征人组合一起的集合体。通过对组授予权限(角色),快速使 一类人具有相同的权限,来简化对用户授予权限的繁琐性、耗时性。用户组的划分,可以按 职位、项目或其它来实现。用户可以属于某一个组或多个组。 通过给某个人赋予权限,有4 种方式( 参考飞思办公系统) A . 通过职位 a) 在职位中,职位成员的权限继承当前所在职位的权限,对于下级职位拥有的权限不可继 承。 b) 实例中:如前台这个职位,对于考勤查询有权限,则可以通过对前台这个职位设置考勤 查询的浏览权,使他们有使用这个对象的权限,然后再设置个,考勤查询权(当然也可以不 设置,默认能进此模块的就能查询),则所有前台人员都拥有考勤查询的权利。 B. 通过项目 a) 在项目中,项目成员的权限来自于所在项目的权限,他们同样不能继承下级项目的权限, 而对于项目组长,他对项目有全权,对下级项目也一样。 b) 实例中:在项目中,项目成员可以对项目中上传文档,查看本项目的文档,可以通过对项 目设置一个对于本项目的浏览权来实现进口,这样每个成员能访问这个项目了,再加上项目 文档的上传权和查看文档权即可。 c) 对于组长,因为可以赋予组长一个组长权(组长权是个特殊的权限,它包含其他各种权 限的一个权限包),所有组长对于本项目有全权,则项目组长可以对于项目文档查看,审批, 删除,恢复等,这些权限对于本项目的下级项目依然有效。 C. 通过角色 a) 角色中的成员继承角色的权限,角色与角色没有上下级关系,他们是平行的。通过角色 赋予权限,是指没办法按职位或项目的分类来赋予权限的另一种方式,如:系统管理员,资 料备份员… b) 实例中:对于本系统中,全体人员应该默认都有的模块,如我的邮件,我的文档,我的 日志,我的考勤……,这些模块系统成员都应该有的,我们建立一个角色为系统默认角色, 把所有默认访问的模块的浏览权加入到里面去,则系统成员都能访问这些模块。 D. 直接指定 a) 直接指定是通过对某个人具体指定一项权限,使其有使用这个权限的能力。直接指定是 角色指定的一个简化版,为了是在建立像某个项目的组长这种角色时,省略创建角色这一个 步骤,使角色不至于过多。 b) 实例中:指定某个项目的组长,把组长权指定给某个人。 针对职位、项目组: 如果用添加新员工,员工调换职位、项目组,满足了员工会自动继承所在职位、项目组的权 限,不需要重新分配权限的功能。 用户管理 用户可以属于某一个或多个用户组,可以通过对用户组授权,来对组中的所有用户进行权限 的授予。一个用户可以属于多个项目组,或担任多个职位。 授权管理 将一个基本权限或角色授予用户或用户组,使用户或用户组拥有授予权限的字符串,如果角 色、职位、项目中存在相同的基本权限,则取其中的一 个;如脱离角色、职位、项目组, 只是取消用户或用户组的中此角色、职位、项目组所授予的权限。用户所拥有的权限是所有 途径授予权限的集合。管理员用户可以 查看每个用户的最终权限列表。
基于SSM框架的企业文档管理系统结合Vue框架实现了前后端分离,旨在为企业提供一个高效、安全的文档管理平台,帮助企业实现文档的存储、检索、共享和权限管理等功能。 主要特性包括: 文档上传与存储:用户可以通过系统将文档上传至服务器,系统会自动将文档存储到指定的位置,保证文档的安全性和完整性。 文档检索与查看:系统提供多种检索方式,包括按文档名称、类型、关键词等进行检索,用户可以快速找到所需文档,并支持在线预览和下载,方便用户查看和使用。 文档分类与标记:管理员可以对文档进行分类和标记,包括设置文档所属部门、文档类型、重要程度等信息,帮助用户更好地管理和归档文档。 文档版本管理:系统支持文档的版本管理,用户可以查看文档的历史版本,并进行版本比对和回滚操作,确保文档的更新和管理。 文档分享与协作:用户可以将文档分享给其他用户或部门,支持多人同时在线编辑和评论,实现文档的协作编辑和交流。 权限管理:系统实现了灵活的权限管理机制,包括对文档的访问权限、编辑权限、分享权限等进行设置,确保文档的安全和保密性。 数据备份与恢复:系统定期对文档数据进行备份,确保文档数据的安全性,同时支持数据恢复功能,防止数据丢失和损坏。 前后端分离:采用Vue框架实现前端页面,通过RESTful API与后端SSM框架进行数据交互,提供流畅、快速的用户体验,同时具备良好的系统拓展性和维护性。 通过以上功能,基于SSM框架的企业文档管理系统结合Vue框架,为企业提供了一个全面、高效的文档管理平台,帮助企业实现文档的有效管理和利用,提升工作效率和团队协作能力。前后端分离的设计使得系统具备良好的响应速度和用户体验,满足企业对文档管理的各种需求和期待。

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧