কোনও মাইএসকিউএল ব্যবহারকারীর উপস্থিতি আছে এবং এটি ড্রপের উপর ভিত্তি করে চেক করার কোনও স্ট্যান্ডার্ড উপায় নেই। এই জন্য কোন workaround আছে?
সম্পাদনা করুন: ত্রুটি
যেমন না ছুঁড়েই এটি চালানোর জন্য আমার সোজা উপায় দরকার
DROP USER test@localhost; :
কোনও মাইএসকিউএল ব্যবহারকারীর উপস্থিতি আছে এবং এটি ড্রপের উপর ভিত্তি করে চেক করার কোনও স্ট্যান্ডার্ড উপায় নেই। এই জন্য কোন workaround আছে?
সম্পাদনা করুন: ত্রুটি
যেমন না ছুঁড়েই এটি চালানোর জন্য আমার সোজা উপায় দরকার
DROP USER test@localhost; :
উত্তর:
মাইএসকিউএল 5.7 যেহেতু আপনি একটি করতে পারেন DROP USER IF EXISTS test
আরও তথ্য: http://dev.mysql.com/doc/refman/5.7/en/DP-user.html
এটি আমার পক্ষে কাজ করেছে:
GRANT USAGE ON *.* TO 'username'@'localhost';
DROP USER 'username'@'localhost';
এটি ব্যবহারকারীর তৈরি করে যদি এটি ইতিমধ্যে বিদ্যমান না থাকে (এবং এটিকে একটি নিরীহ সুযোগ দেয়) তবে তা যেকোন উপায়ে মুছে ফেলবে। এখানে সমাধান খুঁজে পেয়েছেন: http://bugs.mysql.com/bug.php?id=19166
আপডেটগুলি: @ হাও যোগ করার প্রস্তাব দেয়IDENTIFIED BY ; @ অ্যান্ড্রেব (মন্তব্যগুলিতে) নিষ্ক্রিয় করার পরামর্শ দেয় NO_AUTO_CREATE_USER।
IDENTIFIED BYএটি আসলে কাজ করার জন্য আমার দরকার ছিল ।
ফিজোমের উত্তরের জন্য (সর্বাধিক ভোট দেওয়া হয়েছে) মনে হয়েছে, অনুদানের বিবৃতি শেষে আপনি যদি "চিহ্নিত" হন তবে ব্যবহারকারী স্বয়ংক্রিয়ভাবে তৈরি হবে। আপনি যদি না করেন তবে ব্যবহারকারী তৈরি হয় না। নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে,
GRANT USAGE ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password';
DROP USER 'username'@'localhost';
আশাকরি এটা সাহায্য করবে.
মাইএসকিউএল ফোরামগুলির একটি থেকে এর উত্তর পেয়েছে। আমাদের ব্যবহারকারীকে মুছতে একটি পদ্ধতি ব্যবহার করতে হবে।
ব্যবহারকারী এখানে ডাটাবেসের নাম "পরীক্ষা" এবং "ডাটাবেসনাম"।
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
আপডেট:
মাইএসকিউএল 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')
উম ... সব জটিলতা ও কৌশল কেন?
তারপরে 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;
@ চেরিয়ান এর উত্তর সম্পর্কে, নিম্নলিখিত লাইনগুলি সরানো যেতে পারে:
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
আমি চেরিয়ান এর উত্তর দ্বারা অনুপ্রাণিত এই পদ্ধতি লিখেছি। পার্থক্যটি হ'ল আমার সংস্করণে ব্যবহারকারীর নাম প্রক্রিয়াটির একটি যুক্তি (এবং হার্ড কোডিং নয়)। আমি ব্যবহারকারীকে বাদ দেওয়ার পরেও প্রয়োজনীয় প্রয়োজনীয় ফ্লুশ প্রচারগুলি করছি।
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 )
DROP USER 'user'@'localhost';
উপরের কমান্ডটি ব্যবহারকারীকে ডাটাবেস থেকে নামিয়ে দেবে, তবে, একই ব্যবহারকারী ইতিমধ্যে ডাটাবেস ব্যবহার করছেন কিনা তা জানা গুরুত্বপূর্ণ , ব্যবহারকারী সেই সেশনটি বন্ধ না করা পর্যন্ত সেই সেশনটি শেষ হবে না। এটি নোট করা গুরুত্বপূর্ণ যে বাদ দেওয়া ব্যবহারকারী ডাটাবেস অ্যাক্সেস করবে এবং যে কোনও ক্রিয়াকলাপ সম্পাদন করবে। ব্যবহারকারীকে ফেলে দেওয়া বর্তমান ব্যবহারকারীর সেশনকে বাদ দেয় না
ফাইজমের উত্তর (যা আমার জন্য এখনই কাজ করে নি) এর সাথে অ্যান্ডেরবের মন্তব্যের সাথে (যা এটি কেন হয়নি তা বোঝায়) আমি এই আপাতদৃষ্টিতে কাজ করার কোডটি দিয়ে শেষ করেছি যা অস্থায়ীভাবে 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'@'%';
আপনার যদি বিদ্যালয়ের একটি সার্ভার থাকে যেখানে শিক্ষার্থীরা প্রচুর পরিশ্রম করে। আপনি কেবল এই দ্বারা জঞ্জাল পরিষ্কার করতে পারেন:
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;
আপনি যদি বলতে চান যে আপনি কোনও টেবিল থেকে একটি ড্রপ উপস্থিত আছে তা মুছতে চান, আপনি DELETEআদেশটি ব্যবহার করতে পারেন , উদাহরণস্বরূপ:
DELETE FROM users WHERE user_login = 'foobar'
যদি কোনও সারি মিলে না যায় তবে এটি ত্রুটি নয়।