التحقق مما إذا كان تسجيل الدخول إلى خادم SQL موجود بالفعل

StackOverflow https://stackoverflow.com/questions/1379437

  •  21-09-2019
  •  | 
  •  

سؤال

أحتاج إلى التحقق مما إذا كان هناك تسجيل دخول معين بالفعل على خادم SQL ، وإذا لم يحدث ذلك ، فأنا بحاجة إلى إضافته.

لقد وجدت الرمز التالي لإضافة تسجيل الدخول إلى قاعدة البيانات فعليًا ، لكنني أريد أن ألف هذا في عبارة 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 وبعد ذلك دون استخدام طريقة عرض 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.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>];

مصدر: كيفية التحقق مما إذا كان مستخدم قاعدة البيانات موجودًا بالفعل في قاعدة بيانات Azure SQL

أولاً عليك التحقق من وجود تسجيل الدخول باستخدام عرض 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top