MySQL 오류 1449 : 정의 자로 지정된 사용자가 존재하지 않습니다


352

다음 쿼리를 실행하면 오류가 발생합니다.

SELECT
  `a`.`sl_id`                     AS `sl_id`,
  `a`.`quote_id`                  AS `quote_id`,
  `a`.`sl_date`                   AS `sl_date`,
  `a`.`sl_type`                   AS `sl_type`,
  `a`.`sl_status`                 AS `sl_status`,
  `b`.`client_id`                 AS `client_id`,
  `b`.`business`                  AS `business`,
  `b`.`affaire_type`              AS `affaire_type`,
  `b`.`quotation_date`            AS `quotation_date`,
  `b`.`total_sale_price_with_tax` AS `total_sale_price_with_tax`,
  `b`.`STATUS`                    AS `status`,
  `b`.`customer_name`             AS `customer_name`
FROM `tbl_supplier_list` `a`
  LEFT JOIN `view_quotes` `b`
    ON (`b`.`quote_id` = `a`.`quote_id`)
LIMIT 0, 30

오류 메시지는 다음과 같습니다.

#1449 - The user specified as a definer ('web2vi'@'%') does not exist

왜 그 오류가 발생합니까? 어떻게 고치나요?


7
VIEW 'view_quotes을'CREATE 우리에게 SHOW보기
jordeu

오류는 view_quotes보기 조건에 있어야합니다 .
Shell

이것에 대해 잠시 생각하고 가장 간단한 조치는 데이터베이스에 누락 된 계정을 추가하는 것이었고 오류는 사라졌습니다. 복잡한 절차가 필요하지 않습니다. 계정을 추가 할 수 있다면 먼저 시도하십시오.
user1794918

답변:


539

이는 일반적으로 해당 오브젝트를 작성한 사용자가 더 이상 존재하지 않으므로 한 데이터베이스 또는 서버에서 다른 데이터베이스 또는 서버로보기 / 트리거 / 프로 시저를 내보낼 때 발생합니다.

두 가지 옵션이 있습니다.

1. DEFINER 변경

DEFINER덤프에서 명령문을 제거하여 데이터베이스 오브젝트를 처음 가져올 때 가장 쉬운 방법 입니다.

나중에 정의자를 변경하는 것은 조금 까다 롭습니다.

뷰의 정의자를 변경하는 방법

  1. 이 SQL을 실행하여 필요한 ALTER 문을 생성하십시오.

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. ALTER 문 복사 및 실행

저장 프로 시저에 대한 정의자를 변경하는 방법

예:

UPDATE `mysql`.`proc` p SET definer = 'user@%' WHERE definer='root@%'

모든 데이터베이스의 모든 정의자가 변경되므로주의하십시오.

2. 누락 된 사용자 생성

MySQL 데이터베이스를 사용하는 동안 다음 오류가 발견 된 경우 :

The user specified as a definer ('someuser'@'%') does not exist`

그런 다음 다음을 사용하여 해결할 수 있습니다.

GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password';
FLUSH PRIVILEGES;

에서 http://www.lynnnayko.com/2010/07/mysql-user-specified-as-definer-root.html

이것은 매력처럼 작동했습니다 someuser. 누락 된 사용자의 이름으로 만 변경하면됩니다 . 로컬 개발자 서버에서는 일반적으로을 사용할 수 있습니다 root.

또한 실제로 사용자에게 ALL권한 을 부여 해야하는지 또는 적은 권한으로 수행 할 수 있는지 고려하십시오 .


1
. 부여 옵션이 필요하지 않습니다.
helpse

@Simon East : 멋진 편집을했습니다. 답변을 많이 개선해 주셔서 대단히 감사합니다.
Chococroc

"UPDATE mysql. procp SET definer = 'user @ %'WHERE definer = 'root @ %'"쿼리를 실행 한 후 mySQL 인스턴스를 추가하고 다시 시작하는 것이 좋습니다 . 프로 시저에 대한 정의자는 새로 고치기 만하기 때문입니다.
johan

1
다음에 dbdump를 수행하고 가져올 때 뷰 / 프로 시저 편집을 다시 수행 할 필요가 없기 때문에 의미없는 사용자를 추가하는 것이 더 쉽다고 생각합니다.
DarkMukke

1
고맙게도 문제가있는 테이블을 삭제하고 제거한 다음 DEFINER=`user`@`host`다시 가져 왔습니다. 매력처럼 일했다. : ok_hand :
giovannipds

139

원래 SQL보기 또는 프로 시저를 작성한 사용자가 삭제되었습니다. 해당 사용자를 다시 작성하면 오류를 해결해야합니다.


3
또한 추가 된 사용자에게 적어도 SELECTEXECUTE권한을 부여해야합니다 . 루틴을 만든 사용자가 테스트 서버에 존재하지 않는 한 서버에서 다른 서버로 DB 백업을 내보낼 때이 문제가 발생했습니다.
drew010

5
감사합니다. 도움이되었습니다. mysqldump를 사용하여 마이그레이션하거나 배포 할 때 종종 VIEW, TRIGGER 또는 PROCEDURE (정의 자)를 생성 한 사용자가 대상 시스템에서 동일하지 않을 수 있습니다. 이 경우 절차를 다시 작성하기 만하면 대상 시스템에서 유효한 사용자를 사용하여 트리거 또는보기 ( DROP다시 시작 CREATE)해야합니다.
Eric Kigathi

38
정의자가 누구인지 기존 사용자로 변경할 수도 있습니다.UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

1
내 경우에는 삭제 된 DEFINER 사용자를 가리키는 트리거가있는 테이블이 있습니다. 트리거 사용자를 업데이트하면 문제가 해결되었습니다.
Miguel

또한 해당 사용자에게 권한을 부여해야합니다 :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor

50

mysql을 업데이트 한 후 동일한 오류가 발생했습니다.

이 명령 후에 오류가 수정되었습니다.

mysql_upgrade -u root

mysql_upgrade는 MySQL을 업그레이드 할 때마다 실행되어야합니다. 모든 데이터베이스의 모든 테이블에서 현재 버전의 MySQL 서버와의 비 호환성을 확인합니다. 테이블에 비 호환성이있는 것으로 확인되면 확인합니다. 문제가 발견되면 테이블이 복구됩니다. mysql_upgrade는 시스템 테이블을 업그레이드하여 추가되었을 수있는 새로운 권한이나 기능을 활용할 수 있습니다.


이것이 왜 작동하지 않는지 확실하지 않으면 mySQL Workbench에서 모든 트리거를 수동으로 제거해야했습니다.
user752746

35

사용자가 존재하면 다음을 수행하십시오.

mysql> flush privileges;

34

다음과 같이 삭제 된 사용자를 작성하십시오.

mysql> create user 'web2vi';

또는

mysql> create user 'web2vi'@'%';

3
누락 된 사용자를 만든 후 다른 오류가 발생했습니다. 사용자를 만든 ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'grant all on *.* to 'web2vi'@'%' identified by ''
후이

31

이 단계를 따르세요:

  1. PHPMyAdmin으로 이동
  2. 데이터베이스를 선택하십시오
  3. 테이블을 선택하세요
  4. 상단 메뉴에서 '트리거'를 클릭하십시오
  5. 트리거를 편집하려면 '편집'을 클릭하십시오
  6. 정의자를 [user @ localhost]에서 root @ localhost로 변경

그것이 도움이되기를 바랍니다.


1
이것은 사용자를 생성하고 권한을 부여하는 것이 아니라 질문에 대한 실제 솔루션입니다. 정의자를 변경하십시오.
Ankit Chauhan

데이터베이스에서 모든 트리거를 찾는 방법이 있습니까?
Mrugesh Mistry

1
모든 트리거 찾기 : 트리거 표시
JerzySkalski

트리거를 클릭 네비게이션 바의 오른쪽 상단에있는 다음 데이터베이스를 선택하면 phpMyAdmin에서 '쇼 triggerss'명령 줄에서
hussainfrotan

21

솔루션은 아래와 같이 한 줄짜리 쿼리입니다.

grant all on *.* to 'ROOT'@'%' identified by 'PASSWORD' with grant option;

교체 ROOT하여 MySQL의 사용자 이름. PASSWORDmysql 비밀번호로 교체하십시오 .


1
주의 : MySQL 사용자는 대소 문자를 구분합니다.
Alessio Cantarella

나는 flush privileges이것을 후에해야했고 효과가있다. 감사.
빅터

14

이 주석을 실행하여 수정했습니다.

grant all on *.* to 'web2vi'@'%' identified by 'root' with grant option;
FLUSH PRIVILEGES;

당신이 얻는 경우 some_other대신 web2vi당신은 그에 따라 이름을 변경해야합니다.


13

향후 Google 직원의 경우 :보기가 포함되지 않은 데이터베이스의 테이블을 업데이트하려고하는 비슷한 메시지가 나타납니다. 파고 나면 해당 테이블에서 트리거를 가져 왔으며 존재하지 않는 사용자가 정의한 것으로 나타났습니다. 트리거를 삭제하면 문제가 해결되었습니다.


트리거가 문제였습니다. 트리거 섹션에서 정의자를 업데이트했습니다. 더 이상 문제가 없습니다.
다리우스

감사합니다. 매우 도움이됩니다. 또한 뷰를 업데이트해야합니다.
toxxxa

실제로 매우 도움이됩니다 :) 나는 그것을 혼자 찾지 못할 것입니다.
ElChupacabra


7

파일을 해결하고 덤프하는 빠른 수정 사항 :

mysqldump --single-transaction -u root -p xyz_live_db > xyz_live_db_bkup110116.sql

1
이 작동하지 않습니다. 정의자는 덤프에 포함됩니다.
phil294

"d"대신 "p"와 함께 mysqlpump를 사용하는 경우 --skip-definer
Wouter를

@lyhong 자세한 설명은 없지만 --single-transaction덤프 중에 Lock Tables가 구현되는 방식을 분명히 변경합니다. 아니면 그런 것. 어디에서 읽었는지 기억이 나지 않아서 "플래그를 던지는 것"에 익숙해졌습니다. 나는 또한 설명 할 수없는 '이것 만해라' "답변"으로 불안하다. 어느 쪽이든, 그것은 내 사건에 효과적이었습니다.
셰릴 호 만

7
grant all on *.* to 'username'@'%' identified by 'password' with grant option;

예:

grant all on *.* to 'web2vi'@'%' identified by 'password' with grant option;

'user'@ 'all ips'에 모든 권한을 부여하면 보안은 어떻습니까?
Mohsen Abasi

@MohsenAbasi 이것은 개발 환경의 예입니다. 이 사용자는 시스템 관리자가 될 수 있습니다. 찌르기 환경은 더 조심해야합니다.
mesutpiskin

7

한 서버에서 다른 서버로 DB를 옮긴 후에 이런 일이 일어났습니다. 처음에 정의자는 localhost와 사용자를 사용했습니다. 새 서버에는 해당 사용자가 없으며 호스트도 변경되었습니다. 특정 테이블을 백업하고 phpmyadmin에서 모든 트리거를 수동으로 제거했습니다 . 그 후 그것은 나를 위해 잘 작동했습니다.


팁 덕분에 mySQL 워크 벤치에서 모든 트리거를 수동으로 제거 할 수있었습니다.
user752746

이것은 실제로 나를위한 방아쇠 문제였습니다. 나는 그것들을 모두 제거하고 다시 만들어야했습니다.
paul.ago

트리거를 재생성하는 것 외에 다른 솔루션이 있습니까? 테스트 덤프를 하루에 두 번 사용하고 있습니다. 이것은 내 주요 공정을 방해 할 것
redestructa

@TS Guhan 트리거를 수동으로 제거한 후 트리거를 다시 추가 했습니까?
MailBlade

6

나는 교체 할 때 나를 위해 일한 루트 사용자 ans와 같은 문제가 있었다.

root@%

으로

root@localhost

따라서 사용자 'web2vi'가 'localhost'에서 연결되도록 허용 된 경우 다음을 시도 할 수 있습니다.

web2vi@localhost

데이터베이스에 원격으로 연결되어 있습니다.


4

내 5 센트

뷰에서 선택하려고 할 때 동일한 오류가 발생했습니다.

그러나이보기는 다른 서버의 백업에서 복원 된 다른보기에서 선택한 것으로 보입니다.

사실, 그렇습니다. 사용자는 유효하지 않았지만 처음부터 어디로 가야하는지 명확하지 않았습니다.


4

몇 분 전에 같은 문제가 있었지만 mysql.user 테이블에서 사용하지 않는 사용자를 삭제 한 후이 문제가 발생했지만 변경보기를 수행하면 문제가 해결되었습니다. 매우 간단한 명령을 사용하면 매우 간단합니다.

SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ",
table_name," AS ", view_definition,";") FROM 
information_schema.views WHERE table_schema='databasename'

이것을 mysql 명령 행과 혼합하십시오 (Windows에 익숙하지 않은 * nix 가정).

> echo above_query | mysql -uuser -p > alterView.sql
> mysql -uuser -ppass databasename < alterView.sql

참고 : 명령은 파일에서 추가 SELECT CONCAT을 생성하여 mysql -uuser -ppass databasename < alterView.sql 제거하지 않으면 실패합니다.

출처 : /dba/4129/modify-definer-on-many-views


4

절차를 다음과 같이 설정하십시오 SECURITY INVOKER

MySQL은 기본적으로 프로 시저 보안을 "DEFINER"(CREATOR OF)로 설정합니다. 보안을 "호출자"로 설정해야합니다.


3

"view_quotes"보기가 "web2vi"가 유효한 사용자가 아닌 다른 데이터베이스에서 "web2vi"가 유효한 사용자가 아닌 데이터베이스로 복사되었을 수 있습니다.
"web2vi"사용자를 데이터베이스에 추가하거나보기를 변경하십시오 (일반적으로 DEFINER = 'web2vi'@ '%'부분을 제거하고 스크립트를 실행하면 트릭이 수행됩니다)


3

필자의 경우 테이블에 존재하지 않는 DEFINER 사용자가 트리거를했습니다.


2
앱이 서버에서 다른 서버로 전송 될 때 특히 손톱에
zardilior

2

에서 MySQL의 참조CREATE VIEW:

DEFINER 및 SQL SECURITY 절은보기 호출시 액세스 권한을 검사 할 때 사용될 보안 컨텍스트를 지정합니다.

이 사용자는 반드시 존재해야하며 항상 'localhost'를 호스트 이름으로 사용하는 것이 좋습니다. 따라서 사용자가 존재하는지 확인하고 작성보기에서 'localhost'로 변경하면이 오류가 발생하지 않는다고 생각합니다.


2

문제는 분명하다-MySQL은 정의 자로 지정된 사용자를 찾을 수 없다.

개발 서버에서 데이터베이스 모델을 동기화하여 localhost에 적용하고 모델을 변경 한 다음 localhost에 다시 적용한 후이 문제점이 발생했습니다. 분명히 뷰 (수정)가 정의되어 로컬 버전을 업데이트 할 수 없었습니다.

(쉽게) 수정하는 방법 :

참고 : 삭제가 포함되어있어보기에 적합하지만 테이블에서 시도하면 데이터가 백업되어 있는지 확인하십시오.

  1. 데이터베이스에 루트로 로그인하십시오 (또는 변경하기에 충분한 권한이있는 모든 것).
  2. 보기, 표 또는 문제가있는 것을 삭제하십시오.
  3. 새 모델을 동기화하십시오-현재 존재하지 않는 것에 대해 불평하지 않습니다. 문제가있는 항목 정의에서 SQL SECURITY DEFINER 부분 을 제거 할 수 있습니다 .

추신 : 이것은 적절하거나 최선의 해결책이 아닙니다. 방금 가능한 (매우 간단한) 솔루션으로 게시했습니다.


나는 두꺼비, cn을 사용하고 있습니다. 단지 os에서 rooy로 로그인 한 다음에만해야합니까?
Vasanth Nag KV

2

당신은 이것을 시도 할 수 있습니다 :

$ mysql -u root -p 
> grant all privileges on *.* to `root`@`%` identified by 'password'; 
> flush privileges;

2

왜 그 오류가 발생합니까? 어떻게 고치나요?

나는 이런 문제에 대한 결정을 찾기 전에 한 시간을 보냈다. 그러나 제 경우에는 이것을 실행했습니다.

mysql> UPDATE `users` SET `somefield` = 1 WHERE `user_id` = 2;
ERROR 1449 (HY000): The user specified as a definer ('root'@'%') does not exist

실제로 문제를 찾으려면 다음 명령을 하나씩 실행하십시오.

SHOW PROCEDURE STATUS;
SHOW FUNCTION STATUS;
SHOW TRIGGERS;
SHOW FULL TABLES IN database_name WHERE TABLE_TYPE LIKE 'VIEW';

... 그리고 각각의 뒤에 'definer'필드를 찾으십시오.

필자의 경우 누군가의 개발자가 삭제하는 것을 잊어 버린 오래된 방아쇠를 당겼습니다.


1

루틴 편집 섹션으로 이동하고 맨 아래에서 보안 유형을 정의 자에서 호출자로 변경하십시오.


4
어디로가요? 어느 소프트웨어에서?
kenorb

@kenorb, phpMyAdmin에서 보안 유형과 같은 MySQL 저장 루틴 (프로 시저 및 기능)을 변경할 수 있습니다.
Mikl

1

다른 사용자가 작성 / 등록한 하나 이상의보기 뷰의 소유자를 확인하고 다음을 수행해야합니다.

  1. 사용자를 재 작성하십시오. 다른 답변에서 알 수 있듯이. 또는
  2. ALTER VIEW를'web2vi' 사용 하여 사용자가 작성한 뷰를 다시 작성하십시오.

이 문제가 한 번있었습니다.

SQLYog를 사용하여 BD1에서 BD2로 뷰를 마이그레이션하려고했습니다. SQLYog는 다른 데이터베이스 (DB2)에서 뷰를 다시 작성했지만 BD1 사용자 (다른 위치)를 유지했습니다. 나중에 쿼리에서 사용하고있는 뷰가 뷰를 생성하지 않았을 때도 동일한 오류가 있음을 깨달았습니다.

이 도움을 바랍니다.


1

저장 프로 시저 인 경우 다음을 수행 할 수 있습니다.

UPDATE `mysql`.`proc` SET definer = 'YournewDefiner' WHERE definer='OldDefinerShownBefore'

그러나 이것은 권장되지 않습니다.

나에게 더 나은 해결책은 정의자를 만드는 것입니다.

create user 'myuser' identified by 'mypass';
grant all on `mytable`.* to 'myuser' identified by 'mypass';

SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 매뉴얼에서 'mytable'에 대한 모든 권한 부여 '에 대한 올바른 구문을 확인하십시오. *'mypass '로 식별되는'myuser '에'; 라인 1
Cerin

@Cerin, 그냥 mytable 주위의``를``로 변경하십시오. 내 대답은이 문제를 가진 사람들을 돕기위한 것입니다. 당신의 downvote를 재고 할 생각 ..
helpse

1

mysql.proc가 비어 있지만 table_name에 대해 "user@192.168.%"가 존재하지 않는 것을 항상 알 수 있다면, mysql 명령 행에서 루트를 입력하고 다음을 입력하십시오.

CHECK TABLE `database`.`table_name` QUICK FAST MEDIUM CHANGED;
flush privileges;

위에!


1

이것은 MYSQL Workbench 6.3 Community가있는 Windows 10에서 "root @ % 존재하지 않음"덤프를 가져온 후 나에게 일어났습니다. 사용자가 존재하더라도. 먼저 DEFINER를 주석 처리하려고 시도했지만 작동하지 않았습니다. 그런 다음 "root @ %" 에서 "root @ localhost" 로 문자열을 바꾸고 덤프를 다시 가져 왔습니다. 이것은 나를 위해 속임수를했다.



0

데이터베이스 사용자도 대소 문자를 구분하는 것처럼 보이므로 root '@'% 사용자가있는 동안 ROOT '@'% 사용자가 없었습니다. 워크 벤치를 통해 사용자를 대문자로 변경했는데 문제가 해결되었습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.