التحقق مما إذا كان تسجيل الدخول إلى خادم SQL موجود بالفعل
-
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