Tsql 如何创建登录名和用户,但前提是它不存在?

Tsql 如何创建登录名和用户,但前提是它不存在?,tsql,Tsql,我有一个sql脚本来创建登录名和用户,如下所示: USE [master] GO CREATE LOGIN [MyLogin] WITH PASSWORD=N'MyPassword', DEFAULT_DATABASE=[MyNewDatabase], DEFAULT_LANGUAGE=[us_english], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF USE [MyNewDatabase] GO CREATE USER [MyLogin] FOR L

我有一个sql脚本来创建登录名和用户,如下所示:

USE [master]
GO

CREATE LOGIN [MyLogin] WITH PASSWORD=N'MyPassword',
DEFAULT_DATABASE=[MyNewDatabase],
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF

USE [MyNewDatabase]
GO

CREATE USER [MyLogin] FOR LOGIN [MyLogin] WITH DEFAULT_SCHEMA=[MyLogin]
exec sp_addrolemember db_datareader, MyLogin;
exec sp_addrolemember db_datawriter, MyLogin;
GO

CREATE SCHEMA [MyLogin]
GO

但是,我只希望在登录不存在的情况下发生所有这一切。如果我尝试将其包装为“If NOT EXISTS….BEGIN….END”,它将无法工作,因为GO语句将覆盖它。我需要在登录后输入“GO”,这样就可以用于创建用户。那么,在尝试创建登录名和用户之前,如何确保登录名不存在呢?

SQL Server不支持创建{object}(如果不存在)这样的语法。它确实在SQL Server 2017中引入了CREATE或ALTER语法,但是,这仅适用于对象CREATE语句必须是批处理中唯一语句的对象

对于不需要的对象,例如登录名和用户,可以使用if和NOT exists检查对象是否存在。例如:

使用master; 去 如果不存在,请从sys.server\u主体中选择1,其中[name]=N'MyLogin' 创建登录名[MyLogin] 密码为N'MyPassword', 默认_数据库=[MyNewDatabase], 默认语言=[美国英语], 选中\u EXPIRATION=OFF, 勾选_POLICY=OFF; 去 使用[MyNewDatabase]; 去 如果不存在,请从sys.database_principals中选择1,其中[name]=N'MyLogin' 开始 为登录名[MyLogin]创建用户[MyLogin],默认模式为[MyLogin]; 更改角色db_datareader添加成员MyLogin-不要使用sp_addrolemember已被弃用一段时间 更改角色db_datawriter添加成员MyLogin-不要使用sp_addrolemember已被弃用一段时间 终止
是的,我考虑过这种方法,就像在重复检查中一样。我希望没有必要。我确实读到过,如果你真的想让它“停止”,你可能会设置“no exec”,但这听起来像是一个黑客行为。实际上,这不会在第二部分失败吗?我只希望它在不存在的情况下创建登录名,但我只希望它在登录名存在的情况下创建用户。我还假设在创建登录部分应该有一个“开始…结束”包装。实际上,在第二部分不会失败吗?只有在名为MyLogin的登录名为@sr28的用户存在时,它才会失败;否则,该语句将不会运行,因为同名用户已经存在,或者将创建登录用户,无论该登录是否在上一批中创建。由于登录名是在前一批中创建的(如果它不存在),因此用户创建语句的登录名本身将始终存在。