মাইএসকিউএল: ব্যবহারকারীর উপস্থিতি আছে কিনা তা পরীক্ষা করে তা ফেলে দিন


84

কোনও মাইএসকিউএল ব্যবহারকারীর উপস্থিতি আছে এবং এটি ড্রপের উপর ভিত্তি করে চেক করার কোনও স্ট্যান্ডার্ড উপায় নেই। এই জন্য কোন workaround আছে?

সম্পাদনা করুন: ত্রুটি
যেমন না ছুঁড়েই এটি চালানোর জন্য আমার সোজা উপায় দরকার

DROP USER test@localhost; :    

4
আপনি কি কোনও মাইএসকিউএল ব্যবহারকারী বলতে চান? অথবা কোনও ব্যবহারকারী রেকর্ড করেছেন যে আপনি মাইএসকিউএলে একটি টেবিলের মধ্যে সংরক্ষণ করছেন?
জেসন কোহেন

দেখে মনে হচ্ছে মারিয়াডিবির এই বৈশিষ্ট্য রয়েছে: mariadb.com/kb/en/mariadb/DP-user
lmat - মনিকা পুনরায় ইনস্টল করুন

4
ভবিষ্যতে পাঠকদের জন্য: মাইএসকিউএল 5.7 বৈশিষ্ট্য 'ড্রপ USER কে যদি বিদ্যমান' আছে, দেখতে stackoverflow.com/questions/598190/...
আন্দ্রেই Epure

4
@ আন্ড্রেইপিউর যদি আপনি কেবল উত্তর হিসাবে রাখতে পারেন তবে আমি এটিকে সঠিক হিসাবে চিহ্নিত করব।
চেরিয়ান

উত্তর:



87

এটি আমার পক্ষে কাজ করেছে:

GRANT USAGE ON *.* TO 'username'@'localhost';
DROP USER 'username'@'localhost';

এটি ব্যবহারকারীর তৈরি করে যদি এটি ইতিমধ্যে বিদ্যমান না থাকে (এবং এটিকে একটি নিরীহ সুযোগ দেয়) তবে তা যেকোন উপায়ে মুছে ফেলবে। এখানে সমাধান খুঁজে পেয়েছেন: http://bugs.mysql.com/bug.php?id=19166

আপডেটগুলি: @ হাও যোগ করার প্রস্তাব দেয়IDENTIFIED BY ; @ অ্যান্ড্রেব (মন্তব্যগুলিতে) নিষ্ক্রিয় করার পরামর্শ দেয় NO_AUTO_CREATE_USER


4
ইন মাইএসকিউএল ম্যানুয়েল পৃষ্ঠা দান এটি আসলে বলে: "কোন প্রিভিলেজেস" জন্য প্রতিশব্দ: ব্যবহার
stivlo

6
এটি আর বিকল্প নয়। :( মাইএসকিউএল এর বর্তমান সংস্করণটি আর গ্রান্ট স্টেটমেন্টের জন্য কোনও নতুন ব্যবহারকারী তৈরি করে না It এটি একটি "বৈশিষ্ট্য" তারা যুক্ত করেছে;;) দেখে মনে হচ্ছে চেরিয়ানের বিকল্পটি কেবলমাত্র বর্তমানে কাজ করে।
গ্যাজবি

4
@ জাসুরুস dev.mysql.com/doc/refman/5.1/en/grant.html (এছাড়াও 5.5 এবং 5.6) মনে হয় যে আপনি ভুল করছেন। একটি "কোনও অটো ব্যবহারকারী তৈরি করুন" বিকল্প নেই। আমি ম্যানুয়ালটিকে ভুল বুঝে না নিলে তা নির্দেশ করে যে অনুদানের কোন অস্তিত্ব না থাকলে কোনও ব্যবহারকারী তৈরি করবে।
andreb

@ অ্যান্ড্রেব সম্ভবত "NO_AUTO_CREATE_USER" বিকল্পটি চালু ছিল যখন আমি এটি চেষ্টা করেছি বা ডিফল্টরূপে (যেমন আমি এটি পরিবর্তন করি নি)। আমি যদি সময় পাই তবে আমি এই বিকল্পটি বন্ধ করার চেষ্টা করব এবং আবার চেষ্টা করব। এই অপশনটির সাথে কয়েকটি খোলা বাগ রিপোর্ট রয়েছে
যেগুলির মধ্যে একটি হ'ল সমস্যাও হতে পারে

@ হাওর উত্তরটিও দেখুন। IDENTIFIED BYএটি আসলে কাজ করার জন্য আমার দরকার ছিল ।
ম্যাথু

14

ফিজোমের উত্তরের জন্য (সর্বাধিক ভোট দেওয়া হয়েছে) মনে হয়েছে, অনুদানের বিবৃতি শেষে আপনি যদি "চিহ্নিত" হন তবে ব্যবহারকারী স্বয়ংক্রিয়ভাবে তৈরি হবে। আপনি যদি না করেন তবে ব্যবহারকারী তৈরি হয় না। নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে,

GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
DROP USER 'username'@'localhost';

আশাকরি এটা সাহায্য করবে.


আমার 'পাসওয়ার্ড' দ্বারা সনাক্ত না করে কিছু পুরানো স্ক্রিপ্ট ছিল; 5.6 এ কাজ করেছে যে অংশ। কিন্তু 5.7 এ হয়নি। 'পাসওয়ার্ড' অংশের মাধ্যমে সনাক্তকারী যুক্ত করা আমার পক্ষে কৌশলটি করেছে।
জোনসন

13

মাইএসকিউএল ফোরামগুলির একটি থেকে এর উত্তর পেয়েছে। আমাদের ব্যবহারকারীকে মুছতে একটি পদ্ধতি ব্যবহার করতে হবে।

ব্যবহারকারী এখানে ডাটাবেসের নাম "পরীক্ষা" এবং "ডাটাবেসনাম"।


SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ANSI';
USE databaseName ;
DROP PROCEDURE IF EXISTS databaseName.drop_user_if_exists ;
DELIMITER $$
CREATE PROCEDURE databaseName.drop_user_if_exists()
BEGIN
  DECLARE foo BIGINT DEFAULT 0 ;
  SELECT COUNT(*)
  INTO foo
    FROM mysql.user
      WHERE User = 'test' and  Host = 'localhost';
   IF foo > 0 THEN
         DROP USER 'test'@'localhost' ;
  END IF;
END ;$$
DELIMITER ;
CALL databaseName.drop_user_if_exists() ;
DROP PROCEDURE IF EXISTS databaseName.drop_users_if_exists ;
SET SQL_MODE=@OLD_SQL_MODE ;

CREATE USER 'test'@'localhost' IDENTIFIED BY 'a'; GRANT ALL PRIVILEGES ON databaseName.* TO 'test'@'localhost' WITH GRANT OPTION


ধন্যবাদ @ চেরিয়ান আমি নিশ্চিত নই যে এটি এখনও 2017 এ জিনিস করার সবচেয়ে ভাল উপায় তবে কমপক্ষে এটি এগিয়ে যাওয়ার এক উপায়! আমি বিশ্বাস করতে পারি না এটি এখনও এত কঠিন ...
জেএম্যাক

শুধু অবগতির জন্য আপনি সবসময় আপনার উৎসের URL inclue (যেমন উচিত: এক থেকে পাওয়া উত্তর মাইএসকিউএল ফর্ম বা মাইএসকিউএল ধরনের এক (উৎস এখান থেকে)।

4
DROP USER IF EXISTS 'user'@'localhost' ;

যা মারিয়া ডিবিতে কোনও ত্রুটি না ফেলে আমার পক্ষে কাজ করে, এটিও আপনার পক্ষে কাজ করা উচিত


4
মাইএসকিউএল 5.7 এবং উপর, নিশ্চিত। ... ভাগ্যবান আমার, এখানে আমরা যে নতুন সংস্করণটি ব্যবহার করি তা হ'ল 5.5।
tetsujin

4

আপডেট: মাইএসকিউএল 5.7 হিসাবে আপনি DROP USER IF EXISTSবিবৃতি ব্যবহার করতে পারেন । রেফ: https://dev.mysql.com/doc/refman/5.7/en/DP-user.html

বাক্য গঠন: DROP USER [IF EXISTS] user [, user] ...

উদাহরণ: DROP USER IF EXISTS 'jeffrey'@'localhost';

এফওয়াইআই (এবং মাইএসকিউএল এর পুরানো সংস্করণের জন্য), এটি আরও ভাল সমাধান ... !!!

নিম্নলিখিত এসপি 'tempuser'@'%'কার্যকর করে ব্যবহারকারীকে অপসারণ করতে আপনাকে সহায়তা করবেCALL DropUserIfExistsAdvanced('tempuser', '%');

আপনি যদি নামের সমস্ত ব্যবহারকারীকে মুছে ফেলতে চান 'tempuser'(বলুন 'tempuser'@'%', 'tempuser'@'localhost'এবং 'tempuser'@'192.168.1.101') এসপি কার্যকর করুন CALL DropUserIfExistsAdvanced('tempuser', NULL);এটি নামের সমস্ত ব্যবহারকারী মুছে ফেলবে tempuser!!! গুরুত্ব সহকারে ...

এখন দয়া করে উল্লেখিত এসপিটির দিকে একবার নজর দিন DropUserIfExistsAdvanced:

DELIMITER $$

DROP PROCEDURE IF EXISTS `DropUserIfExistsAdvanced`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `DropUserIfExistsAdvanced`(
    MyUserName VARCHAR(100)
    , MyHostName VARCHAR(100)
)
BEGIN
DECLARE pDone INT DEFAULT 0;
DECLARE mUser VARCHAR(100);
DECLARE mHost VARCHAR(100);
DECLARE recUserCursor CURSOR FOR
    SELECT `User`, `Host` FROM `mysql`.`user` WHERE `User` = MyUserName;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET pDone = 1;

IF (MyHostName IS NOT NULL) THEN
    -- 'username'@'hostname' exists
    IF (EXISTS(SELECT NULL FROM `mysql`.`user` WHERE `User` = MyUserName AND `Host` = MyHostName)) THEN
        SET @SQL = (SELECT mResult FROM (SELECT GROUP_CONCAT("DROP USER ", "'", MyUserName, "'@'", MyHostName, "'") AS mResult) AS Q LIMIT 1);
        PREPARE STMT FROM @SQL;
        EXECUTE STMT;
        DEALLOCATE PREPARE STMT;
    END IF;
ELSE
    -- check whether MyUserName exists (MyUserName@'%' , MyUserName@'localhost' etc)
    OPEN recUserCursor;
    REPEAT
        FETCH recUserCursor INTO mUser, mHost;
        IF NOT pDone THEN
            SET @SQL = (SELECT mResult FROM (SELECT GROUP_CONCAT("DROP USER ", "'", mUser, "'@'", mHost, "'") AS mResult) AS Q LIMIT 1);
            PREPARE STMT FROM @SQL;
            EXECUTE STMT;
            DEALLOCATE PREPARE STMT;
        END IF;
    UNTIL pDone END REPEAT;
END IF;
FLUSH PRIVILEGES;
END$$

DELIMITER ;

ব্যবহার:

CALL DropUserIfExistsAdvanced('tempuser', '%'); ব্যবহারকারীর অপসারণ 'tempuser'@'%'

CALL DropUserIfExistsAdvanced('tempuser', '192.168.1.101'); ব্যবহারকারীর অপসারণ 'tempuser'@'192.168.1.101'

CALL DropUserIfExistsAdvanced('tempuser', NULL);নামে সকল ব্যবহারকারীর মুছে ফেলার জন্য 'tempuser'(যেমন।, বলে 'tempuser'@'%', 'tempuser'@'localhost'এবং 'tempuser'@'192.168.1.101')


3

উম ... সব জটিলতা ও কৌশল কেন?

তারপরে DROP ব্যবহারকারী ব্যবহার করুন ... আপনি কেবল mysql.user টেবিল থেকে ব্যবহারকারীকে মুছতে পারেন (যা ব্যবহারকারী উপস্থিত না থাকলে কোনও ত্রুটি ছুঁড়ে না ফেলে) এবং তারপরে পরিবর্তনটি প্রয়োগ করার জন্য বিশেষাধিকারগুলি ফ্লাশ করুন।

DELETE FROM mysql.user WHERE User = 'SomeUser' AND Host = 'localhost';
FLUSH PRIVILEGES;

-- হালনাগাদ --

আমি ভৃল ছিলাম. এটির মতো ব্যবহারকারীকে মুছে ফেলা নিরাপদ নয়। আপনার DROP ব্যবহারকারীর দরকার নেই। যেহেতু অনুদানের মাধ্যমে স্বয়ংক্রিয়ভাবে ব্যবহারকারী তৈরি করতে মাইএসকিএল বিকল্পগুলি সেট করা সম্ভব (আমি ব্যবহার করি এমন একটি বিকল্প), তবুও আমি সেই কৌশলটির প্রস্তাব দেব না। এখানে আমার জন্য কাজ করা একটি সঞ্চিত প্রক্রিয়া থেকে একটি স্নিপেট রয়েছে:

DECLARE userCount INT DEFAULT 0;
SELECT COUNT(*) INTO userCount FROM mysql.user WHERE User = userName AND Host='localhost';
IF userCount > 0 THEN
    SET @S=CONCAT("DROP USER ", userName, "@localhost" );
    PREPARE stmt FROM @S;
    EXECUTE stmt;
    SELECT CONCAT("DROPPED PRE-EXISTING USER: ", userName, "@localhost" ) as info;
END IF;
FLUSH PRIVILEGES;

কেন এটি "নিরাপদ নয়" শেয়ার করবেন ...? কার জন্য নিরাপদ?
ডেজল্ফ

ঠিক আছে, যেহেতু আমি এটিকে এক বছরেরও বেশি আগে পোস্ট করেছি আমি যা উল্লেখ করছি তা আমি 100% মনে করার দাবি করব না। আমি নিশ্চিত যে আমি বোঝাতে চাইছিলাম এটি নির্ভরযোগ্যতা ব্যবহারকারীকে সিস্টেম থেকে পুরোপুরি অপসারণ করে না। আমি মনে করি ড্রপ ব্যবহারকারী কেবল মাইএসকিএল.ইউজার টেবিল থেকে একটি সারি অপসারণের চেয়ে আরও বেশি কিছু সম্পাদন করে। দুঃখিত, এই বিবরণগুলি এখন কী তা আমি ভাবতে পারি না!
বুভিন জে

যদি আমি অনুমান করছিলাম আমি বলব যে সুবিধার রেকর্ডগুলি সরানো হয়নি, তবে "অনাথ" হয়ে উঠবেন? (আপনার সেটিংসের উপর নির্ভর করে?)
বুভিন জে

2

@ চেরিয়ান এর উত্তর সম্পর্কে, নিম্নলিখিত লাইনগুলি সরানো যেতে পারে:

SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ANSI';
...
SET SQL_MODE=@OLD_SQL_MODE;
...

এটি 5.1.23 পূর্বের একটি বাগ ছিল। সংস্করণ পরে এই আর প্রয়োজন হয় না। সুতরাং, অনুলিপি / পেস্টের সুবিধার্থে, উপরের লাইনগুলি সরিয়ে দিয়ে এখানে একই। আবার, উদাহরণস্বরূপ "পরীক্ষা" ব্যবহারকারী এবং "ডাটাবেসনাম" ডাটাবেস; এবং এটি এই বাগ থেকে এসেছিল ।

DROP PROCEDURE IF EXISTS databaseName.drop_user_if_exists ;
DELIMITER $$
CREATE PROCEDURE databaseName.drop_user_if_exists()
BEGIN
  DECLARE foo BIGINT DEFAULT 0 ;
  SELECT COUNT(*)
  INTO foo
    FROM mysql.user
      WHERE User = 'test' and  Host = 'localhost';
   IF foo > 0 THEN
         DROP USER 'test'@'localhost' ;
  END IF;
END ;$$
DELIMITER ;
CALL databaseName.drop_user_if_exists() ;
DROP PROCEDURE IF EXISTS databaseName.drop_users_if_exists ;

CREATE USER 'test'@'localhost' IDENTIFIED BY 'a';
GRANT ALL PRIVILEGES  ON databaseName.* TO 'test'@'localhost'
 WITH GRANT OPTION

2

আমি চেরিয়ান এর উত্তর দ্বারা অনুপ্রাণিত এই পদ্ধতি লিখেছি। পার্থক্যটি হ'ল আমার সংস্করণে ব্যবহারকারীর নাম প্রক্রিয়াটির একটি যুক্তি (এবং হার্ড কোডিং নয়)। আমি ব্যবহারকারীকে বাদ দেওয়ার পরেও প্রয়োজনীয় প্রয়োজনীয় ফ্লুশ প্রচারগুলি করছি।

DROP PROCEDURE IF EXISTS DropUserIfExists;
DELIMITER $$
CREATE PROCEDURE DropUserIfExists(MyUserName VARCHAR(100))
BEGIN
  DECLARE foo BIGINT DEFAULT 0 ;
  SELECT COUNT(*)
  INTO foo
    FROM mysql.user
      WHERE User = MyUserName ;
   IF foo > 0 THEN
         SET @A = (SELECT Result FROM (SELECT GROUP_CONCAT("DROP USER"," ",MyUserName,"@'%'") AS Result) AS Q LIMIT 1);
         PREPARE STMT FROM @A;
         EXECUTE STMT;
         FLUSH PRIVILEGES;
   END IF;
END ;$$
DELIMITER ;

আমি কোডরেউভিউ ওয়েবসাইটেও এই কোডটি পোস্ট করেছি ( /codereview/15716/mysql-DP-user-if-exists )


2
DROP USER 'user'@'localhost';

উপরের কমান্ডটি ব্যবহারকারীকে ডাটাবেস থেকে নামিয়ে দেবে, তবে, একই ব্যবহারকারী ইতিমধ্যে ডাটাবেস ব্যবহার করছেন কিনা তা জানা গুরুত্বপূর্ণ , ব্যবহারকারী সেই সেশনটি বন্ধ না করা পর্যন্ত সেই সেশনটি শেষ হবে না। এটি নোট করা গুরুত্বপূর্ণ যে বাদ দেওয়া ব্যবহারকারী ডাটাবেস অ্যাক্সেস করবে এবং যে কোনও ক্রিয়াকলাপ সম্পাদন করবে। ব্যবহারকারীকে ফেলে দেওয়া বর্তমান ব্যবহারকারীর সেশনকে বাদ দেয় না


0

ফাইজমের উত্তর (যা আমার জন্য এখনই কাজ করে নি) এর সাথে অ্যান্ডেরবের মন্তব্যের সাথে (যা এটি কেন হয়নি তা বোঝায়) আমি এই আপাতদৃষ্টিতে কাজ করার কোডটি দিয়ে শেষ করেছি যা অস্থায়ীভাবে NO_AUTO_CREATE_USER মোডটি সক্রিয় করা থাকলে এটি অক্ষম করে:

set @mode = @@SESSION.sql_mode;
set session sql_mode = replace(replace(@mode, 'NO_AUTO_CREATE_USER', ''), ',,', ',');
grant usage on *.* to 'myuser'@'%';
set session sql_mode = @mode;
drop user 'myuser'@'%';

0

টার্মিনাল করতে:

sudo mysql -u root -p

পাসওয়ার্ড লিখুন

select user from mysql.user;

এখন ব্যবহারকারী 'the_username' মুছুন

DROP USER the_unername;

আপনি মুছে ফেলতে চান এমন ব্যবহারকারীর সাথে 'the_username' প্রতিস্থাপন করুন।


-1

আপনার যদি বিদ্যালয়ের একটি সার্ভার থাকে যেখানে শিক্ষার্থীরা প্রচুর পরিশ্রম করে। আপনি কেবল এই দ্বারা জঞ্জাল পরিষ্কার করতে পারেন:

delete from user where User != 'root' and User != 'admin';
delete from db where User != 'root' and User != 'admin';

delete from tables_priv;
delete from columns_priv;

flush privileges;

-6

আপনি যদি বলতে চান যে আপনি কোনও টেবিল থেকে একটি ড্রপ উপস্থিত আছে তা মুছতে চান, আপনি DELETEআদেশটি ব্যবহার করতে পারেন , উদাহরণস্বরূপ:

 DELETE FROM users WHERE user_login = 'foobar'

যদি কোনও সারি মিলে না যায় তবে এটি ত্রুটি নয়।


4
আমি মনে করি ওপি একটি বাস্তব ডাটাবেস ব্যবহারকারীকে বোঝায়।
টমলাক

6
এটি হ'ল সহজ সমাধান আইএমও। কেবলমাত্র সঠিক এসকিউএল প্রয়োজন: mysql.user যেখানে ব্যবহারকারী = 'ফুবার' থেকে মুছে ফেলুন
জন রিক্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.