Sql server MSSQL如何仅在数据库可用时创建DB用户

Sql server MSSQL如何仅在数据库可用时创建DB用户,sql-server,tsql,if-statement,Sql Server,Tsql,If Statement,我在SQL Server上,想创建一个脚本,在不同的数据库中创建一个数据库用户,但我不知道运行时哪些数据库可用。如果数据库不可用,我只想跳过用户创建。 我想出了这个密码: IF EXISTS (SELECT 1 FROM sys.databases WHERE NAME = 'MyDB') BEGIN IF NOT EXISTS (SELECT 1 FROM MyDB.sys.database_principals WHERE NAME = 'XUser') BEGIN

我在SQL Server上,想创建一个脚本,在不同的数据库中创建一个数据库用户,但我不知道运行时哪些数据库可用。如果数据库不可用,我只想跳过用户创建。 我想出了这个密码:

IF EXISTS (SELECT 1 FROM sys.databases WHERE NAME = 'MyDB')
BEGIN
    IF NOT EXISTS (SELECT 1 FROM MyDB.sys.database_principals WHERE NAME = 'XUser')
    BEGIN
        /* This fails when DB MyDB is not available, despite it should not run at all */
        USE MyDB

        SELECT 'Creating User ''XUser''.'
        CREATE user XUser
        FROM LOGIN XUser
    END
    ELSE
    BEGIN
        SELECT 'User ''XUser'' in MyDB already exists, skipping creation.'
    END
    SELECT 'User ''XUser'' gets special user role in MyDB database.'
    EXEC MyDB..sp_addrolemember 'db_owner', 'SpecialUser'
END
ELSE
BEGIN
    SELECT 'Warning: DB MyDB not found. Login ''XUser'' doesn''t get additional rights on that database.'
END
但它不起作用,我明白了

Database 'MyDB' does not exist.
USE语句似乎是个问题,但如果没有它,用户将无法在正确的数据库中创建


我怎样才能得到我想要的呢?

你需要在这里使用延期对账单。即使在数据库不存在的情况下,
USE
语句将无法到达,但数据库仍然需要存在,否则解析器将检测到无效的数据库名称,并且该语句将失败:

打印并创建用户“XUser”;
EXEC sys.sp_executesql不使用MyDB;从登录名XUser;'创建用户XUser;

另外,不要使用
sp_addrolemember
,它已经被弃用至少13年了;使用
alterrole

您需要在此处使用延迟语句。即使在数据库不存在的情况下,
USE
语句将无法到达,但数据库仍然需要存在,否则解析器将检测到无效的数据库名称,并且该语句将失败:

打印并创建用户“XUser”;
EXEC sys.sp_executesql不使用MyDB;从登录名XUser;'创建用户XUser;
另外,不要使用
sp_addrolemember
,它已经被弃用至少13年了;使用
更改角色