如何使用密码传输应用程序角色?

时间:2012-12-07 06:11:30

标签: c# sql-server smo

我需要从现有数据库(MS SQL 2012)制作某种模板。模板必须具有相同的模式(表,索引,角色等),但它不能包含源数据库中的数据。

为实现这一目标,我正在使用SMO的Transfer类。我目前的转移设置是:

        transfer.CopyAllObjects = true;
        transfer.CopyAllSynonyms = true;
        transfer.CopyData = false;

        transfer.Options.WithDependencies = true;
        transfer.Options.DriAll = true;
        transfer.Options.Triggers = true;
        transfer.Options.Permissions = true;
        transfer.Options.Indexes = true;
        transfer.Options.ContinueScriptingOnError = true;
        transfer.Options.SchemaQualifyForeignKeysReferences = true;
        transfer.Options.ExtendedProperties = true;

源DB中的一个对象是应用程序角色。为此角色生成的传输脚本如下所示:

/* To avoid disclosure of passwords, the password is generated in script. */
declare @idx as int
declare @randomPwd as nvarchar(64)
declare @rnd as float
select @idx = 0
select @randomPwd = N''
select @rnd = rand((@@CPU_BUSY % 100) + ((@@IDLE % 100) * 100) + 
       (DATEPART(ss, GETDATE()) * 10000) + ((cast(DATEPART(ms, GETDATE()) as int) % 100) * 1000000))
while @idx < 64
begin
   select @randomPwd = @randomPwd + char((cast((@rnd * 83) as int) + 43))
   select @idx = @idx + 1
select @rnd = rand()
end
declare @statement nvarchar(4000)
select @statement = N'CREATE APPLICATION ROLE [MyRole] WITH DEFAULT_SCHEMA = [dbo], ' + N'PASSWORD = N' + QUOTENAME(@randomPwd,'''')
EXEC dbo.sp_executesql @statement

问题:如何使用源DB中的密码传输此角色?我不需要这个“安全”。我找不到合适的转让选项。我错过了一些吗?

1 个答案:

答案 0 :(得分:2)

没有办法做到这一点,因为SQL Server不允许在元数据中查看密码。因此,在传输应用程序角色时,您需要为它们指定新密码。登录以及对称和非对称密钥的各种属性也是如此。