Проверка наличия имени входа в SQL Server.
-
21-09-2019 - |
Вопрос
Мне нужно проверить, существует ли уже определенный логин на SQL Server, а если нет, то мне нужно его добавить.
Я нашел следующий код для добавления имени входа в базу данных, но я хочу (каким-то образом) обернуть его в оператор IF, чтобы проверить, существует ли имя входа в первую очередь.
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
Я понимаю, что мне нужно опросить системную базу данных, но не знаю, с чего начать!
Решение
От здесь
If not Exists (select loginname from master.dbo.syslogins
where name = @loginName and dbname = 'PUBS')
Begin
Select @SqlStatement = 'CREATE LOGIN ' + QUOTENAME(@loginName) + '
FROM WINDOWS WITH DEFAULT_DATABASE=[PUBS], DEFAULT_LANGUAGE=[us_english]')
EXEC sp_executesql @SqlStatement
End
Другие советы
Вот способ сделать это в SQL Server 2005 и более поздних версиях без использования устаревшего представления системных входов:
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
В качестве небольшого дополнения к этой теме отметим, что в целом вам следует избегать использования представлений, начинающихся с sys.sys*, поскольку Microsoft включает их только для обратной совместимости.Для вашего кода вам, вероятно, следует использовать sys.server_principals.Предполагается, что вы используете SQL 2005 или более позднюю версию.
Попробуйте это (замените «пользователь» фактическим именем входа):
IF NOT EXISTS(
SELECT name
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')
BEGIN
--create login here
END
Вы можете использовать встроенную функцию:
SUSER_ID ( [ 'myUsername' ] )
с помощью
IF [value] IS NULL [statement]
нравиться:
IF SUSER_ID (N'myUsername') IS NULL
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
https://technet.microsoft.com/en-us/library/ms176042(v=sql.110).aspx
Это работает на 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, а если нет, то это должно дать вам представление о том, с чего начать поиск.
что именно вы хотите проверить для входа в систему или пользователя?логин создается на уровне сервера, а пользователь создается на уровне базы данных, поэтому логин уникален на сервере
также пользователь создается для входа в систему, пользователь без входа в систему является потерянным пользователем и бесполезен, поскольку вы не можете выполнить вход на сервер sql без входа в систему.
может быть, тебе это нужно
проверить вход в систему
select 'X' from master.dbo.syslogins where loginname=<username>
приведенный выше запрос возвращает «X», если вход в систему существует, иначе возвращает ноль
затем создайте логин
CREATE LOGIN <username> with PASSWORD=<password>
это создает логин на сервере sql. но принимает только надежные пароли
создайте пользователя в каждой базе данных, которую вы хотите использовать для входа в систему как
CREATE USER <username> for login <username>
назначить пользователю права на выполнение
GRANT EXECUTE TO <username>
ВЫ ДОЛЖНЫ ИМЕТЬ разрешения SYSADMIN или для краткости скажите «sa».
вы можете написать для этого процедуру sql в базе данных
create proc createuser
(
@username varchar(50),
@password varchar(50)
)
as
begin
if not exists(select 'X' from master.dbo.syslogins where loginname=@username)
begin
if not exists(select 'X' from sysusers where name=@username)
begin
exec('CREATE LOGIN '+@username+' WITH PASSWORD='''+@password+'''')
exec('CREATE USER '+@username+' FOR LOGIN '+@username)
exec('GRANT EXECUTE TO '+@username)
end
end
end
Это для Azure SQL:
IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>'))
DROP LOGIN [<login>];
Источник: Как проверить, существует ли уже пользователь базы данных в базе данных SQL Azure
Сначала вам нужно проверить существование входа в систему, используя представление 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