将SQL用户存储在变量

时间:2017-03-02 11:56:16

标签: tsql sql-server-2014

我在SSMS(2014)中生成了一些创建脚本,并且作为脚本的一部分,创建了多个帐户。我们将根据数据库是否部署到测试,预生产或生产来使用不同的帐户。

我想让安装程序更容易更改帐户,所以我认为如果我可以存储登录名并在脚本的最顶层声明这是一个好主意,不过我和#39 ;我不知道该怎么做。

目前我有:

CREATE USER [RAMBOLL\SVC_D-StructureDB] FOR LOGIN [somedomain\someaccount] WITH DEFAULT_SCHEMA=[dbo]
GO
ALTER ROLE [db_datareader] ADD MEMBER [somedomain\someaccount]
GO
ALTER ROLE [db_datawriter] ADD MEMBER [somedomain\someaccount]
GO

如何声明" somedomain \ someaccount"然后在上面的SQL代码中引用它?我试过但SQL并不喜欢它。

DECLARE @SomeAccount VARCHAR(255)
SET @SomeAccount = "[somedomain\someaccount]"

CREATE USER @SomeAccount FOR LOGIN @SomeAccount WITH DEFAULT_SCHEMA=[dbo]
    GO
    ALTER ROLE [db_datareader] ADD MEMBER @SomeAccount
    GO
    ALTER ROLE [db_datawriter] ADD MEMBER @SomeAccount
    GO

1 个答案:

答案 0 :(得分:0)

这些遗留和将要删除的存储过程允许参数化

但是,如果只有几个选项,我会考虑一个IF声明。如果你需要更多的灵活性,那么动态SQL

DECLARE @env VARCHAR(10)
SET @env = 'test'

IF @env = 'test'
BEGIN
    CREATE USER [somedomain\someaccount] FOR LOGIN [somedomain\someaccount] WITH DEFAULT_SCHEMA=[dbo]
    ALTER ROLE [db_datareader] ADD MEMBER [somedomain\someaccount]
    ALTER ROLE [db_datawriter] ADD MEMBER [somedomain\someaccount]
END
ELSE IF @env = 'live'
BEGIN
    CREATE USER [somedomain\liveaccount] FOR LOGIN [somedomain\liveaccount]WITH DEFAULT_SCHEMA=[dbo]
    ALTER ROLE [db_datareader] ADD MEMBER [somedomain\liveaccount]
    ALTER ROLE [db_datawriter] ADD MEMBER [somedomain\liveaccount]
END
...