কোনও এসকিউএল সার্ভার লগইন ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করা হচ্ছে


176

এসকিউএল সার্ভারে একটি নির্দিষ্ট লগইন ইতিমধ্যে উপস্থিত রয়েছে কিনা তা আমাকে খতিয়ে দেখা দরকার এবং যদি তা না হয় তবে আমার এটি যুক্ত করা দরকার।

আমি ডাটাবেসে লগইনটি যুক্ত করার জন্য নীচের কোডটি পেয়েছি, তবে লগইনটির অস্তিত্ব আছে কিনা তা পরীক্ষা করার জন্য আমি এটি একটি আইএফ স্টেটমেন্টে (কোনওভাবে) মোড়ানো করতে চাই।

CREATE LOGIN [myUsername] WITH PASSWORD=N'myPassword', 
DEFAULT_LANGUAGE=[us_english], 
CHECK_EXPIRATION=OFF, 
CHECK_POLICY=OFF 
GO

আমি বুঝতে পারি যে একটি সিস্টেম ডাটাবেস সম্পর্কে আমার জিজ্ঞাসাবাদ করা দরকার, তবে কোথায় শুরু করবেন তা নিশ্চিত নয়!


10
এটি একটি গুরুত্বপূর্ণ প্রশ্ন, তবে কথ্য হিসাবে এটি মনে হচ্ছে একটি গুরুত্বপূর্ণ পার্থক্য: ব্যবহারকারী বনাম লগইন। জনের সাথে সংযুক্ত যে সম্ভাব্য নকলটি সত্যিই ব্যবহারকারীদের সম্পর্কে বলে মনে হচ্ছে। এই প্রশ্নটি শিরোনামে "ব্যবহারকারী" বলে, তবে প্রশ্ন কোড এবং স্বীকৃত উত্তরে লগইনগুলির সাথে ডিল করে। আমি সেই অনুসারে শিরোনাম এবং প্রশ্ন সম্পাদনা করেছি।
LarsH

1
কেবলমাত্র @ লার্শ-এর মন্তব্যে যুক্ত করার জন্য, লগইনগুলি একটি এসকিউএল সার্ভার উদাহরণের সাথে যুক্ত এবং ব্যবহারকারীরা একটি নির্দিষ্ট ডাটাবেসের সাথে যুক্ত। ডেটাবেস ব্যবহারকারীদের সার্ভার লগইন থেকে তৈরি করা যায়, তাই তাদের একটি নির্দিষ্ট ডাটাবেসে অ্যাক্সেস থাকে। এই দুর্দান্ত নিবন্ধটি দেখুন এবং প্রকৃতপক্ষে পুরো সিরিজটি এটির অংশ (এসকিউএল সার্ভার সুরক্ষা থেকে স্টারওয়ে)
বিপরীত প্রকৌশলী

উত্তর:


141

থেকে এখানে

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

6
এসকিএল ইঞ্জেকশন আটকাতে আপনার কোয়েট ব্যবহার করা উচিত। আক্রমণকারী একটি @ লগিননাম পাস করতে পারেx] with password ''y'';\r\ndrop table foo;\r\n
রেমাস রুসানু

2
স্ট্রিং হিসাবে একটি বিবৃতি তৈরি করা এবং তারপরে কেবল সরাসরি প্রবেশের পরিবর্তে sp_executesql ব্যবহার করা কেন প্রয়োজনীয় ছিল CREATE LOGIN [@loginName] FROM ...? আমার অজ্ঞতা ক্ষমা করুন, আমি শিখতে চাই ...
লার্শ

4
@ লার্শ: স্ট্রিং হিসাবে স্টেটমেন্ট তৈরি করা প্রয়োজন কারণ ক্রিয়েট লগইন লগইন নামের জন্য কোনও পরামিতি ব্যবহার করতে পারে না, এর জন্য একটি স্ট্রিং আক্ষরিক প্রয়োজন। কেন তা নিশ্চিত নয়, তবে আমি খুঁজে পেলাম যে এটি সঠিক hard
জোসেফ বোঙ্গার্টস

@ জোসেফবঙ্গার্টস: ঠিক আছে, ধন্যবাদ আমার ধারণা এটি নির্বাচনী বিবৃতিতে টেবিলের নামগুলির মতো। সম্ভবত ধারণাটি হ'ল আক্রমণগুলি থেকে ক্ষতিগ্রস্থ ভূ-পৃষ্ঠের ক্ষেত্র হ্রাস করা, যদিও আমি জানি না যে এটি সাহায্য করবে।
LarsH

1
আমি মনে করি পুরো বিবৃতিটি নয়, QUOTENAME()তার চারপাশে @loginNameচলেছে এবং তারপরে আপনি চারপাশের ম্যানুয়াল [এবং] ডিলিমিটারগুলি থেকে মুক্তি পেতে পারেন @loginName
ব্রায়ানারি

288

এসকিউএল সার্ভার 2005 এ এটি করার একটি উপায় এবং পরে অবহেলিত সিসলোগিন ভিউ ব্যবহার না করে:

IF NOT EXISTS 
    (SELECT name  
     FROM master.sys.server_principals
     WHERE name = 'LoginName')
BEGIN
    CREATE LOGIN [LoginName] WITH PASSWORD = N'password'
END

সার্ভার_প্রিন্টিয়ালস ভিউ স্কেল_লগিনের পরিবর্তে ব্যবহৃত হয় কারণ পরবর্তী উইন্ডোজ লগইনগুলি তালিকাভুক্ত করে না।

আপনার যদি কোনও নির্দিষ্ট ডাটাবেসে কোনও ব্যবহারকারী তৈরি করার আগে তাদের অস্তিত্ব পরীক্ষা করতে হয় তবে আপনি এটি করতে পারেন:

USE your_db_name

IF NOT EXISTS
    (SELECT name
     FROM sys.database_principals
     WHERE name = 'Bob')
BEGIN
    CREATE USER [Bob] FOR LOGIN [Bob] 
END

17
সেরা উত্তর, কোনও গতিশীল স্কোয়াএল জড়িত নয়, বা কোনও ব্যবহারের অবমূল্যায়ন নেই। ধন্যবাদ!
ক্যাস্পার লিওন নিলসন

7
এসকিউএল অ্যাজুরের ক্ষেত্রে, দুটি টার্গেট টেবিলগুলি হ'ল সিএসএসএইচএল_লগিনস এবং সিসসুসেসারস - এটি উত্তরে অন্তর্ভুক্ত করা ভাল হতে পারে।
ব্রেট

আপনার স্ক্রিপ্টে কোনও পরিবর্তনশীল ব্যবহারকারীর নাম ব্যবহার করার প্রয়োজন হলে দরকারী নয়।
রস প্রেসার

@ ডেরেক মরিসন এসআইডি
অ্যাস্ট্রোবয়

30

এই থ্রেডটিতে সামান্য সংযোজন হিসাবে, সাধারণভাবে আপনি sys.sys * দিয়ে শুরু হওয়া ভিউগুলি ব্যবহার করা এড়াতে চান কারণ মাইক্রোসফ্ট কেবল তাদের পিছনের সামঞ্জস্যের জন্য অন্তর্ভুক্ত করে। আপনার কোডের জন্য আপনার সম্ভবত sys.server_prصولগুলি ব্যবহার করা উচিত। এটি ধরে নিচ্ছে যে আপনি এসকিউএল 2005 বা তার বেশি ব্যবহার করছেন।


পরীক্ষিত, কাজ করে এবং অন্যান্য উত্তরের চেয়ে আরও বেশি বর্তমান। আপনার কাছেও +1।
ডেভিড

হ্যাঁ, 2005 এর সাথে মাইক্রোসফ্ট সিস্টেম টেবিলগুলিতে সরাসরি অ্যাক্সেস সরিয়ে নিয়েছে। পুরানো কোড ভঙ্গ করা থেকে বিরত রাখতে, তারা এমন মতামত অন্তর্ভুক্ত করে যা পুরাতন টেবিলগুলির একই নাম ছিল। তবে এগুলি কেবল পুরানো কোডের জন্য এবং নতুন কোডটি নতুন মতামত ব্যবহার করা উচিত। বিওএল-এ, আপনার কী ব্যবহার করা উচিত তা জানতে ম্যাপিং সিস্টেম টেবিলগুলিতে একটি অনুসন্ধান করুন।
বোমলিন

11

আপনি অন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারেন:

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


নীতিমালা এবং মেয়াদোত্তীকরণের চেকগুলি অক্ষম করে optionচ্ছিক ক্ষেত্রগুলিকে অন্তর্ভুক্ত করার জন্য উন্নীত
আর্কিবাল্ড

8

এটি ব্যবহার করুন (প্রকৃত লগইন নামের সাথে 'ব্যবহারকারী' প্রতিস্থাপন করুন):

IF NOT EXISTS(
SELECT name 
FROM [master].[sys].[syslogins]
WHERE NAME = 'user')

BEGIN 
    --create login here
END

@ মার্ক: দুঃখিত তবে আপনি ভুল সারণী [সিসলগিনস] লগইন রাখে এবং টেবিল [সিসুজার্স] ব্যবহারকারীদের রাখে।
abatishchev

6

এটি এসকিউএল সার্ভার 2000 এ কাজ করে।

use master
select count(*) From sysxlogins WHERE NAME = 'myUsername'

এসকিউএল 2005-এ, দ্বিতীয় লাইনটি এ পরিবর্তন করুন

select count(*) From syslogins WHERE NAME = 'myUsername'

আমি এসকিউএল 2008 সম্পর্কে নিশ্চিত নই, তবে আমি অনুমান করছি যে এটি এসকিউএল 2005 এর মতো হবে এবং যদি তা না হয় তবে এটি আপনাকে কোথায় সন্ধান শুরু করবে তার একটি ধারণা দেওয়া উচিত।


5

লগইন বা ব্যবহারকারীর জন্য আপনি ঠিক কী চান? একটি লগইন সার্ভার স্তরে তৈরি করা হয় এবং একটি ব্যবহারকারী ডাটাবেস স্তরে তৈরি হয় যাতে সার্ভারে লগইনটি অনন্য

এছাড়াও একজন ব্যবহারকারী একটি লগইনের বিপরীতে তৈরি করা হয়, লগইন ছাড়াই একজন ব্যবহারকারী অনাথ ব্যবহারকারী এবং লগইন ছাড়াই এসকিএলএল সার্ভার লগইন চালাতে না পারায় এটি কার্যকর নয়

সম্ভবত আপনার এই প্রয়োজন

লগইন জন্য পরীক্ষা করুন

select 'X' from master.dbo.syslogins where loginname=<username>

উপরের ক্যোয়ারী 'এক্স' প্রদান করে যদি লগইন উপস্থিত থাকে তবে অন্যটি শূন্য হয় return

তারপরে একটি লগইন তৈরি করুন

CREATE LOGIN <username> with PASSWORD=<password>

এটি স্কেল সার্ভারে একটি লগইন তৈরি করে b তবে এটি কেবল শক্ত পাসওয়ার্ড গ্রহণ করে

লগইন হিসাবে আপনি চান প্রতিটি ডাটাবেসে একটি ব্যবহারকারী তৈরি করুন

CREATE USER <username> for login <username>

ব্যবহারকারীর নির্বাহের অধিকার নির্ধারণ করুন

 GRANT EXECUTE TO <username>

আপনি সিসডমিনের অনুমতি নিতে হবে বা সংক্ষেপে 'সা' বলুন

আপনি এটির জন্য একটি ডেটাবেজে একটি স্কয়ার পদ্ধতি লিখতে পারেন

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

5

লগইন, ভূমিকা, ব্যবহারকারী ইত্যাদির মধ্যে নামকরণের বিরোধের হাতছাড়াtype করার জন্য আপনার মাইক্রোসফ্ট sys.datedia_prصول সংক্রান্ত ডকুমেন্টেশন অনুযায়ী কলামটি পরীক্ষা করা উচিত

ব্যবহারকারীর নাম ইত্যাদিতে বিশেষ অধ্যায়গুলি পরিচালনা করতে N'<name>'এবং সে [<name>]অনুযায়ী ব্যবহার করুন ।

লগইন তৈরি করুন

USE MASTER
IF NOT EXISTS (SELECT 1 FROM master.sys.server_principals WHERE 
[name] = N'<loginname>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
    CREATE LOGIN [<loginname>] <further parameters>

ডাটাবেস ব্যবহারকারী তৈরি করুন

USE <databasename>
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE 
[name] = N'<username>' and [type] IN ('C','E', 'G', 'K', 'S', 'U'))
    CREATE USER [<username>] FOR LOGIN [<loginname>]

ডাটাবেস ভূমিকা তৈরি করুন

USE <databasename>
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE 
[name] = N'<rolename>' and Type = 'R')
    CREATE ROLE [<rolename>]

ভূমিকাটিতে ব্যবহারকারী যুক্ত করুন

USE <databasename>
EXEC sp_addrolemember N'<rolename>', N'<username>'

ভূমিকা অধিকার প্রদান

USE <databasename>
GRANT SELECT ON [<tablename>] TO [<rolename>]
GRANT UPDATE ON [<tablename>] ([<columnname>]) TO [<rolename>]
GRANT EXECUTE ON [<procedurename>] TO [<rolename>]


-1

প্রথমে আপনাকে সিসলোগিন ভিউ ব্যবহার করে লগইন অস্তিত্ব পরীক্ষা করতে হবে:

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

1
আমি ডুনো - এই বলে যে "আপনাকে সিসলগিনস ভিউ ব্যবহার করে লগইন অস্তিত্ব পরীক্ষা করতে হবে", তারপরে এমন কোড পোস্ট করা যা সেই দর্শনটি কোনও অনুলিপি এবং পেস্ট ইস্যুর মতো দেখাচ্ছে না। এছাড়াও, প্রথম বিবৃতি দেওয়ার পরে, সমান্তরাল ফর্মটি ব্যবহার করে "তারপরে আপনাকে আপনার ডাটাবেসটির অস্তিত্ব পরীক্ষা করতে হবে" লাইনটি দেখে মনে হচ্ছে আপনি কোনও ডিবি স্তরের ব্যবহারকারী নয়, কোনও ডাটাবেসের অস্তিত্ব পরীক্ষা করতে বলছেন। এবং আপনাকে উল্লেখ করতে হবে যে দ্বিতীয় ব্যাচটি লক্ষ্য ডিবিতে চালানো দরকার। সামগ্রিকভাবে, এটি কেবল খুব খারাপ ব্যাখ্যা। এবং যেহেতু আপনি এটির পাঁচ বছর পরে এটিকে যুক্ত করেছেন সর্বোচ্চ উত্তোলিত উত্তর একই বলেছে তবে আরও ভাল ...
হাসছে ভার্জিল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.