检查SQL Serverlogin是否已经存在
我需要检查SQL Server上是否已经存在特定的login名,如果没有,那么我需要添加它。
我发现下面的代码实际上将login添加到数据库,但我想包装这个在IF语句(以某种方式)来检查login是否存在第一。
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 = QUOTENAME('CREATE LOGIN [' + @loginName + '] FROM WINDOWS WITH DEFAULT_DATABASE= [PUBS], DEFAULT_LANGUAGE=[us_english]') EXEC sp_executesql @SqlStatement End
下面是在SQL Server 2005及更高版本中执行此操作的一种方法,不使用不build议使用的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,因为后者不列出Windowslogin名。
如果在创build特定数据库之前需要检查用户是否存在,那么可以这样做:
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开头的视图,因为微软只是为了向后兼容而包含它们。 对于你的代码,你应该使用sys.server_principals。 这假设你正在使用SQL 2005或更高版本。
试试这个(用实际的login名replace“user”):
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上,将第二行更改为
select count(*) From syslogins WHERE NAME = 'myUsername'
我不确定SQL 2008是什么,但是我猜测它和SQL 2005是一样的,如果不是这样的话,这会让你知道从哪里开始看。
你究竟想要什么来检查login或用户? 在服务器级别创buildlogin,并在数据库级别创build用户,因此login在服务器中是唯一的
还创build一个用户login,一个用户没有login是一个孤立的用户,并没有用,因为你不能执行sql serverlogin没有login
也许你需要这个
检查login
select 'X' from master.dbo.syslogins where loginname=<username>
上面的查询返回'X'如果login存在,否则返回null
然后创build一个login
CREATE LOGIN <username> with PASSWORD=<password>
这将在sql server中创build一个login名,但它只接受强密码
在你想要login的每个数据库中创build一个用户
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
首先,您必须使用syslogins视图检查login存在:
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