Проверка того, что уже существует учетная запись SQL Server

Мне нужно проверить, существует ли уже определенный логин на SQL Server, а если нет, то мне нужно его добавить.

Я нашел следующий код, чтобы фактически добавить логин в базу данных, но я хочу обернуть его в инструкции IF (каким-то образом), чтобы проверить, существует ли первый вход.

CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword', 
DEFAULT_LANGUAGE=[us_english], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF 
GO

Я понимаю, что мне нужно допросить системную базу данных, но не знаю, с чего начать!

Ответ 1

От здесь

If not Exists (select loginname from master.dbo.syslogins 
    where name = @loginName and dbname = 'PUBS')
Begin
Select @SqlStatement = QUOTENAME('CREATE LOGIN [' + @loginName + '] 
FROM WINDOWS WITH DEFAULT_DATABASE=     [PUBS], DEFAULT_LANGUAGE=[us_english]')

EXEC sp_executesql @SqlStatement
End

Ответ 2

Вот как это сделать в SQL Server 2005 и более поздних версиях без использования устаревшего представления syslogins:

IF NOT EXISTS 
    (SELECT name  
     FROM master.sys.server_principals
     WHERE name = 'LoginName')
BEGIN
    CREATE LOGIN [LoginName] WITH PASSWORD = N'password'
END

Представление server_principals используется вместо sql_logins, потому что последнее не перечисляет логины Windows.

Если вам необходимо проверить наличие пользователя в конкретной базе данных перед их созданием, вы можете сделать это:

USE your_db_name

IF NOT EXISTS
    (SELECT name
     FROM sys.database_principals
     WHERE name = 'Bob')
BEGIN
    CREATE USER [Bob] FOR LOGIN [Bob] 
END

Ответ 3

В качестве незначительного дополнения к этому потоку, в общем, вы хотите избежать использования представлений, начинающихся с sys.sys *, поскольку Microsoft только включает их для обратной совместимости. Для вашего кода вы, вероятно, должны использовать sys.server_principals. Предполагается, что вы используете SQL 2005 или выше.

Ответ 4

Попробуйте это (замените "пользователь" на фактическое имя входа):

IF NOT EXISTS(
SELECT name 
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')

BEGIN 
    --create login here
END

Ответ 5

Это работает на SQL Server 2000.

use master
select count(*) From sysxlogins WHERE NAME = 'myUsername'

на SQL 2005, измените вторую строку на

select count(*) From syslogins WHERE NAME = 'myUsername'

Я не уверен в SQL 2008, но я предполагаю, что он будет таким же, как SQL 2005, а если нет, это должно дать вам представление о том, где начать поиск.

Ответ 6

что вы точно хотите проверить для входа или пользователя? логин создается на уровне сервера, и пользователь создается на уровне базы данных, поэтому логин уникален на сервере

также пользователь создается против входа в систему, пользователь без входа в систему - это осиротевший пользователь и не полезен, поскольку вы не можете выполнять вход в sql-сервер без входа

Возможно, вам нужно это

проверить наличие логина

select 'X' from master.dbo.syslogins where loginname=<username>

приведенный выше запрос возвращает 'X', если login exists else возвращает null

затем создайте логин

CREATE LOGIN <username> with PASSWORD=<password>

это создает логин в SQL-сервере. но он принимает только надежные пароли

создать пользователя в каждой базе данных, для которой вы хотите зарегистрироваться, как

CREATE USER <username> for login <username>

назначить права пользователя пользователю

 GRANT EXECUTE TO <username>

У ВАС ДОЛЖНО иметь разрешения SYSADMIN или сказать 's' для краткости

вы можете написать процедуру sql для этого в базе данных

create proc createuser
(
@username varchar(50),
@password varchar(50)
)
as
begin
if not exists(select 'X' from master.dbo.syslogins where [email protected])
begin
 if not exists(select 'X' from sysusers where [email protected])
 begin
exec('CREATE LOGIN '[email protected]+' WITH PASSWORD='''[email protected]+'''')
exec('CREATE USER '[email protected]+' FOR LOGIN '[email protected])
exec('GRANT EXECUTE TO '[email protected])
end
end
end

Ответ 7

Сначала вам нужно проверить существование входа в систему с помощью представления syslogins:

IF NOT EXISTS 
    (SELECT name  
     FROM master.sys.server_principals
     WHERE name = 'YourLoginName')
BEGIN
    CREATE LOGIN [YourLoginName] WITH PASSWORD = N'password'
END

Затем вам нужно проверить существование вашей базы данных:

USE your_dbname

IF NOT EXISTS
    (SELECT name
     FROM sys.database_principals
     WHERE name = 'your_dbname')
BEGIN
    CREATE USER [your_dbname] FOR LOGIN [YourLoginName] 
END