[推荐] 得到一个给定用户使用了的权限脚本

[推荐]得到一个给定用户使用了的权限脚本

——通过知识共享树立个人品牌。

得到一个给定用户使用了的权限脚本,直接上代码,自己研究。

SETANSI_NULLSON

GO
SETQUOTED_IDENTIFIERON
GO
CREATEPROCEDURE[dbo].[p_user_permissions_script_get]
-----------------------------------------------------------
--OBJECTNAME:dbo.p_user_permissions_script_get
--AUTHOR:EricHu
--DATE:01/05/2012
--INPUTPARAMETERS:
@userNameVARCHAR(500)
--
--OUTPUTPARAMETERS:none
--DEPENDENCIES:none
--DESCRIPTION:Usedtoscriptoutpermissionsforagivenuser
--MODIFICATIONHISTORY:
-------------------------------------------------------------
AS

SETNOCOUNTON

DECLARE@DatabaseUserName[SYSNAME];

SET@DatabaseUserName=@userName;


DECLARE@errStatementVARCHAR(1000),
@msgStatementVARCHAR(1000),
@DatabaseUserIDSMALLINT,
@ServerUserNameSYSNAME,
@RoleNameVARCHAR(1000),
@ObjectIDINT,
@ObjectNameVARCHAR(1000),
@StateDescVARCHAR(1000),
@permissionNameVARCHAR(1000)




SELECT@DatabaseUserID=su.[uid],
@ServerUserName=sl.[loginname]
FROMdbo.[sysusers]su
INNERJOIN[master].dbo.[syslogins]sl
ONsu.[sid]=sl.[sid]
WHEREsu.[name]=@DatabaseUserName

IF@DatabaseUserIDISNULL
BEGIN
SET@errStatement='User'+@DatabaseUserName+'doesnotexistin'+DB_NAME()
+CHAR(13)+'Pleaseprovidethenameofacurrentuserin'+DB_NAME()
+'youwishtoscript.'

RAISERROR(@errStatement,
16,
1)
END
ELSE
BEGIN
SET@msgStatement='--Securitycreationscriptforuser'+@ServerUserName+CHAR(13)
+'--CreatedAt:'+CONVERT(VARCHAR,GETDATE(),100)
+REPLACE(CONVERT(VARCHAR,GETDATE(),108),':','')+CHAR(13)
+'--CreatedBy:'+SUSER_NAME()+CHAR(13)+'--AddUserToDatabase'
+CHAR(13)+'USE['+DB_NAME()+']'+CHAR(13)
+'EXEC[sp_grantdbaccess]'+CHAR(13)+CHAR(9)
+'@loginame='''+@ServerUserName+''','+CHAR(13)+CHAR(9)
+'@name_in_db='''+@DatabaseUserName+''''+';'+CHAR(13)+'GO'
+CHAR(13)+'--AddUserToRoles'

PRINT@msgStatement

DECLARE_sysusersCURSORLOCALFORWARD_ONLYREAD_ONLYFOR
SELECT[name]
FROM[dbo].[sysusers]
WHERE[uid]IN(SELECT[groupuid]
FROM[dbo].[sysmembers]
WHERE[memberuid]=@DatabaseUserID)

OPEN_sysusers

FETCHNEXTFROM_sysusersINTO@RoleName

WHILE@@FETCH_STATUS=0
BEGIN
SET@msgStatement='EXEC[sp_addrolemember]'+CHAR(13)+CHAR(9)+'@rolename='''
+@RoleName+''','+CHAR(13)+CHAR(9)+'@membername='''
+@DatabaseUserName+''''+';';

PRINT@msgStatement

FETCHNEXTFROM_sysusersINTO@RoleName
END


CLOSE_sysusers;

DEALLOCATE_sysusers;

--Databaselevelperms;

PRINT'--SetDatabaselevelPermissions';
DECLARE_databaselevelpermsCURSORLOCALFORWARD_ONLYREAD_ONLYFOR
SELECT
sdp.state_desc,
sdp.permission_name
FROM
sys.database_permissionssdpWITH(NOLOCK)

JOINsysuserssuWITH(NOLOCK)
ONsu.uid=sdp.grantee_principal_id

WHERE
su.name=@userName
ANDsdp.class_desc='DATABASE';


OPEN_databaselevelperms;

FETCHNEXTFROM_databaselevelpermsINTO@StateDesc,@PermissionName;

WHILE@@FETCH_STATUS=0
BEGIN

PRINT@StateDesc+CHAR(13)+CHAR(9)+@PermissionName+CHAR(13)+CHAR(9)
+'TO'+@userName+';';

FETCHNEXTFROM_databaselevelpermsINTO@StateDesc,@PermissionName

END

CLOSE_databaselevelperms;

DEALLOCATE_databaselevelperms;

SET@msgStatement='GO'+CHAR(13)+'--SetObjectSpecificPermissions'

PRINT@msgStatement;

DECLARE_sysobjectsCURSORLOCALFORWARD_ONLYREAD_ONLYFOR
SELECTDISTINCT([sysobjects].[id]),
'['+USER_NAME([sysobjects].[uid])+'].['+[sysobjects].[name]+']'
FROM[dbo].[sysprotects]
INNERJOIN[dbo].[sysobjects]
ON[sysprotects].[id]=[sysobjects].[id]
WHERE[sysprotects].[uid]=@DatabaseUserID;

OPEN_sysobjects;

FETCHNEXTFROM_sysobjectsINTO@ObjectID,@ObjectName;

WHILE@@FETCH_STATUS=0
BEGIN
SET@msgStatement='';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=193
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'SELECT,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=195
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'INSERT,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=197
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'UPDATE,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=196
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'DELETE,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=224
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'EXECUTE,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=26
AND[protecttype]=205)
SET@msgStatement=@msgStatement+'REFERENCES,';

IFLEN(@msgStatement)>0
BEGIN
IFRIGHT(@msgStatement,1)=','
SET@msgStatement=LEFT(@msgStatement,LEN(@msgStatement)-1);

SET@msgStatement='GRANT'+CHAR(13)+CHAR(9)+@msgStatement+CHAR(13)
+CHAR(9)+'ON'+@ObjectName+CHAR(13)+CHAR(9)+'TO'
+@DatabaseUserName+';';

PRINT@msgStatement;
END

SET@msgStatement='';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=193
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'SELECT,'

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=195
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'INSERT,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=197
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'UPDATE,';

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=196
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'DELETE,'

IFEXISTS(SELECT1
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=224
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'EXECUTE,';

IFEXISTS(SELECT*
FROM[dbo].[sysprotects]
WHERE[id]=@ObjectID
AND[uid]=@DatabaseUserID
AND[action]=26
AND[protecttype]=206)
SET@msgStatement=@msgStatement+'REFERENCES,';

IFLEN(@msgStatement)>0
BEGIN
IFRIGHT(@msgStatement,1)=','
SET@msgStatement=LEFT(@msgStatement,LEN(@msgStatement)-1)

SET@msgStatement='DENY'+CHAR(13)+CHAR(9)+@msgStatement+CHAR(13)
+CHAR(9)+'ON'+@ObjectName+CHAR(13)+CHAR(9)+'TO'
+@DatabaseUserName+';';

PRINT@msgStatement;
END

FETCHNEXTFROM_sysobjectsINTO@ObjectID,@ObjectName;
END

CLOSE_sysobjects;

DEALLOCATE_sysobjects;



PRINT'GO'
END


SETNOCOUNTOFF

RETURN0

运行结果实例如下:

EXEC[p_user_permissions_script_get]'dbo'



--Securitycreationscriptforusersa
--Created At: 01 13 2012 4:37PM163729
--Created By:sa
-- AddUserToDatabase
USE[DB_TEST]
EXEC[sp_grantdbaccess]
@loginame= ' sa ',
@name_in_db= ' dbo ' ;
GO
-- AddUserToRoles
EXEC[sp_addrolemember]
@rolename= ' db_owner ',
@membername= ' dbo ' ;
--SetDatabaselevelPermissions
GRANT
CONNECT
TOdbo ;
GO
--SetObjectSpecificPermissions
GO

© 2011EricHu

原创作品,转贴请注明作者和出处,留此信息。

------------------------------------------------

cnBlobs:http://www.cnblogs.com/huyong/
优快云http://blog.youkuaiyun.com/chinahuyong

作者:EricHuDBC\SB\SWebServiceWCFPM等)
出处:http://www.cnblogs.com/huyong/

Q Q80368704 E-Mail: 80368704@qq.com
本博文欢迎大家浏览和转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,在『参考』的文章中,我会表明参考的文章来源,尊重他人版权。若您发现我侵犯了您的版权,请及时与我联系。
更多文章请看[置顶]索引贴——(不断更新中)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值