Verificando un account di accesso di SQL Server esiste già
-
21-09-2019 - |
Domanda
Ho bisogno di verificare se un account di accesso specifico esiste già sul SQL Server, e se non lo fa, poi ho bisogno di aggiungerlo.
Ho trovato il seguente codice per aggiungere in realtà il login al database, ma voglio avvolgere questo in un IF (in qualche modo) per verificare se il login esiste prima.
CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword',
DEFAULT_LANGUAGE=[us_english],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF
GO
ho capito che ho bisogno di interrogare un database di sistema, ma non sai da dove cominciare!
Soluzione
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
Altri suggerimenti
Ecco un modo per fare questo in SQL Server 2005 e in seguito senza utilizzare i syslogins deprecate visualizzare:
IF NOT EXISTS
(SELECT name
FROM master.sys.server_principals
WHERE name = 'LoginName')
BEGIN
CREATE LOGIN [LoginName] WITH PASSWORD = N'password'
END
La vista server_principals viene utilizzato al posto del sql_logins perché quest'ultimo non elenca gli account di accesso di Windows.
Se avete bisogno di verificare l'esistenza di un utente in un particolare database prima di creare loro, allora si può fare questo:
USE your_db_name
IF NOT EXISTS
(SELECT name
FROM sys.database_principals
WHERE name = 'Bob')
BEGIN
CREATE USER [Bob] FOR LOGIN [Bob]
END
Come un minore aggiunta a questa discussione, in generale, si vuole evitare di utilizzare i punti di vista che iniziano con sys.sys * come Microsoft è solo per loro anche per la compatibilità all'indietro. Per il vostro codice, probabilmente si dovrebbe usare sys.server_principals. Ciò presuppone che si sta utilizzando SQL 2005 o superiore.
Prova questo (sostituire 'utente' con il nome di login reale):
IF NOT EXISTS(
SELECT name
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')
BEGIN
--create login here
END
È possibile utilizzare la funzione built-in:
SUSER_ID ( [ 'myUsername' ] )
via
IF [value] IS NULL [statement]
come:
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
Questo funziona in SQL Server 2000.
use master
select count(*) From sysxlogins WHERE NAME = 'myUsername'
su SQL 2005, cambiare la linea 2 a
select count(*) From syslogins WHERE NAME = 'myUsername'
Non sono sicuro su SQL 2008, ma sto cercando di indovinare che sarà lo stesso di SQL 2005 e se no, questo dovrebbe dare un'idea di dove t iniziare la ricerca.
che cosa stai esattamente desidera verificare la presenza di dati di accesso o utente? un account di accesso si crea a livello server e un utente viene creato a livello di database in modo un account di accesso è unico nel server
Inoltre viene creato un utente contro un account di accesso, un utente senza effettuare il login è un utente orfano e non è utile come u cant effettuare login sql server senza un login
forse u bisogno di questo
di controllo per l'accesso
select 'X' from master.dbo.syslogins where loginname=<username>
È possibile che questo ritorno query 'X' se login esiste altro return null
quindi creare un account di accesso
CREATE LOGIN <username> with PASSWORD=<password>
questo crea un account di accesso in SQL Server .ma accetta password solo forti
creare un utente in ogni database che si desidera per l'accesso come
CREATE USER <username> for login <username>
Assegna eseguire i diritti di utente
GRANT EXECUTE TO <username>
Occorre disporre di autorizzazioni di amministratore di sistema o dire 'sa' in breve
è possibile scrivere una procedura SQL per che su un database
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
Questo è per Azure SQL:
IF (EXISTS(SELECT TOP 1 1 FROM sys.sql_logins WHERE [name] = '<login>'))
DROP LOGIN [<login>];
Fonte: Come controllare se l'utente database esiste già nel database SQL Azure
Per prima cosa controlla login esistenza utilizzando syslogins visualizzare:
IF NOT EXISTS
(SELECT name
FROM master.sys.server_principals
WHERE name = 'YourLoginName')
BEGIN
CREATE LOGIN [YourLoginName] WITH PASSWORD = N'password'
END
Poi si controlla la tua esistenza del database:
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