Проверка наличия имени входа SQL Server
Мне нужно проверить, если определенный логин уже существует на SQL Server, и если это не так, то мне нужно добавить его.
Я нашел следующий код, чтобы фактически добавить логин в базу данных, но я хочу обернуть это в Оператор IF (каким-то образом), чтобы проверить, существует ли логин первым.
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
Я понимаю, что мне нужно опросить системную базу данных, но не знаете, с чего начать!
9 ответов:
С здесь
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 и более поздних версиях без использования устаревшего представления 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
как незначительное дополнение к этому потоку, в общем случае вы хотите избежать использования представлений, которые начинаются с sys.sys* поскольку Microsoft включает их только для обратной совместимости. Для вашего кода, вероятно, следует использовать sys.сервер-участник. Это предполагает, что вы используете SQL 2005 или выше.
попробуйте это (заменить "пользователь" с фактическим именем пользователя):
IF NOT EXISTS( SELECT name FROM [master].[sys].[syslogins] WHERE NAME = 'user') BEGIN --create login here END
это работает на SQL Server 2000.
use master select count(*) From sysxlogins WHERE NAME = 'myUsername'в SQL 2005 измените 2-ю строку на
select count(*) From syslogins WHERE NAME = 'myUsername'Я не уверен в SQL 2008, но я предполагаю, что он будет таким же, как SQL 2005, и если нет, это должно дать вам представление о том, где начать искать.
что именно вы хотите проверить для входа или пользователя ? логин создается на уровне сервера, а пользователь создается на уровне базы данных, поэтому логин уникален на сервере
также пользователь создается против логина, пользователь без логина является осиротевшим пользователем и не является полезным, поскольку u не может выполнять вход в sql server без логина
может быть, вам это нужно
регистрация для входа в систему
select 'X' from master.dbo.syslogins where loginname=<username>приведенный выше запрос возвращает 'X', если логин существует еще возврат null
затем создайте имя Входа
CREATE LOGIN <username> with PASSWORD=<password>это создает имя входа в sql server .но он принимает только надежные пароли
создайте пользователя в каждой базе данных, которую вы хотите для входа в систему как
CREATE USER <username> for login <username>назначить права на выполнение
GRANT EXECUTE TO <username>вы должны иметь разрешения системного администратора или сказать " 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
вы можете использовать встроенную функцию:
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 GOhttps://technet.microsoft.com/en-us/library/ms176042(v=sql.110).aspx
Это для Azure SQL:
IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>')) DROP LOGIN [<login>];источник: как проверить, существует ли пользователь базы данных в базе данных SQL Azure
сначала вы должны проверить наличие логина с помощью syslogins view:
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
Comments