给用户分配收缩日志的权限

木易随风 2012-07-05 11:28:44
自己编写了一个收缩日志的存储过程,里面用到了
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)
其中@dbname=db_name();select top 1 @logName=[name] from sysFiles where charIndex('.ldf',fileName)>0

现在有个普通用户,这个用户只有对部分表进行操作的权限。

问题:怎么为这个普通用户赋予执行收缩日志存储过程的权限,也就是怎么把BACKUP LOG和DBCC SHRINKFILE的权限给它。
环境:MS SQL SERVER 2005
...全文
96 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
木易随风 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
TRY

SQL code
create procedure test
as
begin
EXECUTE AS USER='SA'
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)
......
end

GRANT EXEC ON TEST TO 普……
[/Quote]

提示:无法作为数据库主体执行,因为主体 "sa" 不存在、无法模拟这种类型的主体,或您没有所需的权限。
是把“ EXECUTE AS USER='SA'” 加入到收缩日志的存储过程了吧。

以下是我收缩日志的存储过程:
alter Procedure [dbo].[P_SHRINK_DB]    
as
EXECUTE AS USER='sa'
declare @dbname varchar(50)
Select @dbname=db_name()
if @dbname=''
return
declare @sql varchar(500)
declare @logName varchar(20)
set @sql=''
set @sql='BACKUP LOG '+@dbname+' WITH NO_LOG'
exec(@sql)
set @sql=''
select top 1 @logName=[name] from sysFiles where charIndex('.ldf',fileName)>0
set @sql='DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)'
exec(@sql)
Felixzhaowenzhong 2012-07-05
  • 打赏
  • 举报
回复
GRANT IMPERSONATE ON USER:: dbo TO USER_NAME_A
GO
create procedure test
as
begin
EXECUTE AS USER='dbo'
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)
......
end
GO
GRANT EXECUTE ON TEST TO USER_NAME_A
GO
Felixzhaowenzhong 2012-07-05
  • 打赏
  • 举报
回复
TRY
create procedure test
as
begin
EXECUTE AS USER='SA'
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)
......
end

GRANT EXEC ON TEST TO 普通用户名
木易随风 2012-07-05
  • 打赏
  • 举报
回复
GRANT IMPERSONATE ON USER:: dbo TO USER_NAME_A


这个方法可以用。写写热心帮忙。
Felixzhaowenzhong 2012-07-05
  • 打赏
  • 举报
回复


GRANT IMPERSONATE ON USER:: dbo TO USER_NAME_A
GO
create procedure test
as
begin
EXECUTE AS USER='dbo'
BACKUP DATABASE [mytest] TO DISK = N'D:\11.bak' WITH NOFORMAT, NOINIT, NAME = N'mytest-完整 数据库 备份', SKIP, NOREWIND, NOUNLOAD, COMPRESSION, STATS = 10
end
GO
GRANT EXECUTE ON TEST TO USER_NAME_A
GO

exec test
/*
已处理百分之 10。
已处理百分之 20。
已处理百分之 30。
已处理百分之 40。
已处理百分之 50。
已处理百分之 60。
已处理百分之 70。
已处理百分之 80。
已处理百分之 90。
已为数据库 'mytest',文件 'mytest' (位于文件 1 上)处理了 50720 页。
已为数据库 'mytest',文件 'sec_data' (位于文件 1 上)处理了 8 页。
已处理百分之 100。
已为数据库 'mytest',文件 'mytest_log' (位于文件 1 上)处理了 4 页。
BACKUP DATABASE 成功处理了 50732 页,花费 8.191 秒(48.387 MB/秒)。

*/
Felixzhaowenzhong 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 1 楼 的回复:
TRY

SQL code
create procedure test
as
begin
EXECUTE AS USER='SA'
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNCATEONLY)
......
end

GRANT EXEC ……
[/Quote]

用 这个是我测试过的。


[Quote=引用 2 楼 的回复:]
SQL code

GRANT IMPERSONATE ON USER:: dbo TO USER_NAME_A
GO
create procedure test
as
begin
EXECUTE AS USER='dbo'
BACKUP LOG '+@dbname+' WITH NO_LOG 和 DBCC SHRINKFILE(N'''+@logName+''',0,TRUNC……
[/Quote]

34,593

社区成员

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

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