0

我需要创建一个存储过程(1 个或多个),我可以在计划作业中从主数据库(或其他数据库)调用它,以将权限(用户和权限)恢复到已从源数据库恢复的数据库。我不想在源数据库级别创建用户,因为我想限制对该服务器的访问,因此一旦恢复完成就需要执行存储过程以授予访问权限。我目前有:

use (database);

if ( select objectproperty(object_id('dbo.spMaint_RestorePermissions_database'), 'IsProcedure') ) is null
exec ('create procedure dbo.spMaint_RestorePermissions_database as select 1');
go

alter procedure dbo.spMaint_RestorePermissions_database
as
set nocount on;     
    ----    grant user permission to access database
    create user [domain\userid] for login [domain\userid]
    -----   grant user access rights to database
    exec sp_addrolemember 'db_datareader', 'domain\userid'
go
4

1 回答 1

2

存储过程的限制之一是它们不能包含use database;语句。要完成您要查找的内容,您可以从 master 运行 sp_executesql 并传入一个 tsql 字符串,该字符串在特定数据库的上下文中执行 sp_executesql。像这样的东西:

--This is the tsql statement that gets executed on a specific user db.
--You would use this to build your "create proc", "alter proc", "create user", etc statements.
DECLARE @InnerSql NVARCHAR(MAX) = 'SELECT DB_NAME()'

DECLARE @DB SYSNAME = 'DatabaseName'
DECLARE @Tsql NVARCHAR(MAX) = '[' + @DB + ']..sp_executesql N''' + @InnerSql + ''''

EXEC sp_executesql @Tsql;
于 2014-03-20T17:09:05.327 回答