我遇到以下情况:我有一个安装程序,它在服务器上安装Web门户,并使用批处理文件调用.sql
文件来设置SQL Server。到目前为止,非常好。
在该SQL文件中,除其他外,我还以文化无差异的方式向系统帐户授予权限。我在很大程度上依赖于变量,这导致了问题。
到目前为止,我找到了一个有效的解决方案。然而,它并没有让我感到非常优雅,因为它包括前期"'使用' + @database_creation_string"在所有EXEC声明面前。此脚本的完整相关上下文目前看起来像这样:
DECLARE @database_name NVARCHAR(MAX)
DECLARE @database_name_string NVARCHAR(MAX)
DECLARE @user_name_nt_authority_system NVARCHAR(MAX)
DECLARE @user_name_nt_authority_system_string NVARCHAR(MAX)
SET @database_name = 'fdbn'
SET @database_name_string = QUOTENAME(@database_name)
SET @user_name_nt_authority_system = SUSER_SNAME(0x010100000000000512000000)
SET @user_name_nt_authority_system_string = QUOTENAME(@user_name_nt_authority_system)
EXEC('USE ' + @database_name_string + 'CREATE USER' + @user_name_nt_authority_system_string + 'FOR LOGIN' + @user_name_nt_authority_system_string)
EXEC('USE ' + @database_name_string + 'ALTER ROLE [db_owner] ADD MEMBER' + @user_name_nt_authority_system_string)
如上所述,这有效,但我觉得必须有一种方法来实际更改数据库上下文,所以所有这些都是不可能的。
现在我明白以下内容并不起作用,因为EXEC()语句中发生的所有导航都会在该语句之外被忽略。
EXEC('USE' + @database_name_string)
我无法使用sqlcmd
模式,因为我使用.bat
文件调用脚本。
有更复杂的方法吗?或者在每个'USE' + @database_name_string
语句前面加EXEC
真的是唯一的方法吗?
答案 0 :(得分:0)
另一种方法是在预先挂起相应的DB名称后使用sp_executesql。样本将是: Test.dbo.sp_executesql N' CREATE USER test_user FOR LOGIN [testlogin] WITH DEFAULT_SCHEMA = [dbo]';
图例:测试是数据库名称
在动态替换所需值之后,可以在EXEC内部使用上述语句。