Lỗi MySQL 1449: Người dùng được chỉ định là bộ khử


352

Khi tôi chạy truy vấn sau, tôi gặp lỗi:

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

Thông báo lỗi là:

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

Tại sao tôi nhận được lỗi đó? Làm thế nào để tôi sửa nó?


7
Cho chúng tôi xem SHOW CREATE XEM 'view_quotes'
jordeu

Các lỗi phải ở trong điều kiện view_quotesxem.
Shell

Sau khi suy nghĩ về điều này một lúc và cách hành động đơn giản nhất là thêm tài khoản bị thiếu vào cơ sở dữ liệu và lỗi đã biến mất. Không có thủ tục phức tạp cần thiết. Nếu bạn có thể thêm tài khoản thì hãy thử trước.
dùng1794918

Câu trả lời:


539

Điều này thường xảy ra khi xuất các khung nhìn / kích hoạt / thủ tục từ cơ sở dữ liệu hoặc máy chủ này sang cơ sở dữ liệu khác khi người dùng đã tạo đối tượng đó không còn tồn tại.

Bạn có hai lựa chọn:

1. Thay đổi DEFINER

Điều này có thể dễ thực hiện nhất khi ban đầu nhập các đối tượng cơ sở dữ liệu của bạn, bằng cách xóa bất kỳ DEFINERcâu lệnh nào khỏi kết xuất.

Thay đổi bộ khử sau là một mẹo nhỏ hơn:

Làm thế nào để thay đổi definer cho lượt xem

  1. Chạy SQL này để tạo các câu lệnh ALTER cần thiết

    SELECT CONCAT("ALTER DEFINER=`youruser`@`host` VIEW ", 
    table_name, " AS ", view_definition, ";") 
    FROM information_schema.views 
    WHERE table_schema='your-database-name';
  2. Sao chép và chạy các câu lệnh ALTER

Làm thế nào để thay đổi definer cho các thủ tục được lưu trữ

Thí dụ:

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

Hãy cẩn thận, bởi vì điều này sẽ thay đổi tất cả các định nghĩa cho tất cả các cơ sở dữ liệu.

2. Tạo người dùng bị thiếu

Nếu bạn đã tìm thấy lỗi sau khi sử dụng cơ sở dữ liệu MySQL:

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

Sau đó, bạn có thể giải quyết nó bằng cách sử dụng như sau:

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

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

Điều này hoạt động như một sự quyến rũ - bạn chỉ phải thay đổi someusertên của người dùng bị mất tích. Trên máy chủ dev cục bộ, bạn thường chỉ cần sử dụng root.

Cũng xem xét liệu bạn có thực sự cần cấp ALLquyền cho người dùng hay liệu họ có thể làm với ít hơn không.


1
. và tùy chọn cấp không được yêu cầu.
giúp đỡ

@Simon East: Bạn đã thực hiện một chỉnh sửa đáng yêu, cảm ơn bạn rất nhiều vì đã cải thiện rất nhiều câu trả lời.
Chococroc

Tôi khuyên bạn nên thêm, khởi động lại cá thể myQuery sau khi chạy truy vấn "UPDATE mysql. procP SET definer = 'user @%' WHERE definer = 'root @%'" vì các defin cho các thủ tục chỉ được làm mới sau đó.
johan

1
Tôi nghĩ việc thêm một người dùng vô nghĩa sẽ dễ dàng hơn, vì lần sau khi bạn thực hiện một thao tác và nhập nó, bạn sẽ không cần phải thực hiện chỉnh sửa chế độ xem / thủ tục nữa
DarkMukke

1
Cảm ơn, tôi vừa bỏ bảng với sự cố, xóa DEFINER=`user`@`host`và nhập lại. Làm việc như người ở. : ok_hand:
giovannipds

139

Người dùng ban đầu tạo chế độ xem hoặc thủ tục SQL đã bị xóa. Nếu bạn tạo lại người dùng đó, nó sẽ giải quyết lỗi của bạn.


3
Ngoài ra, bạn sẽ cần cấp ít nhất các đặc quyền SELECTEXECUTEđặc quyền cho người dùng đã thêm. Tôi gặp phải vấn đề này khi tôi xuất bản sao lưu DB từ máy chủ này sang máy chủ khác nơi người dùng tạo thói quen không tồn tại trên máy chủ thử nghiệm.
vẽ

5
Cảm ơn, điều này rất hữu ích. Thông thường, khi di chuyển hoặc triển khai bằng mysqldump, người dùng đã tạo VIEW, TRIGGER hoặc PROCEDURE (bộ khử) có thể không giống nhau trên hệ thống đích. Trong trường hợp đó, chỉ cần tạo lại thủ tục, kích hoạt hoặc xem ( DROPsau đó lại CREATE) bằng cách sử dụng người dùng hợp lệ trên hệ thống đích sẽ thực hiện thủ thuật.
Eric Kigathi

38
bạn cũng có thể thay đổi người UPDATE mysql.proc SET definer = 'my_new_user@localhost' WHERE db = 'mydatatbase';

1
Chính xác trong trường hợp của tôi, tôi đã có một bảng với trình kích hoạt trỏ đến người dùng DEFINER đã bị xóa. Cập nhật người dùng kích hoạt đã giải quyết vấn đề.
Miguel

Bạn cũng cần cấp quyền cho người dùng đó :) GRANT ALL ON *.* TO 'someuser'@'%' IDENTIFIED BY 'complex-password'; FLUSH PRIVILEGES;
Victor

50

Tôi đã nhận được lỗi tương tự sau khi cập nhật mysql.

Lỗi đã được sửa sau lệnh này:

mysql_upgrade -u root

mysql_upTHER nên được thực thi mỗi khi bạn nâng cấp MySQL. Nó kiểm tra tất cả các bảng trong tất cả các cơ sở dữ liệu về sự không tương thích với phiên bản hiện tại của Máy chủ MySQL. Nếu một bảng được tìm thấy có khả năng không tương thích, nó sẽ được kiểm tra. Nếu bất kỳ vấn đề được tìm thấy, bảng được sửa chữa. mysql_upTHER cũng nâng cấp các bảng hệ thống để bạn có thể tận dụng các đặc quyền hoặc khả năng mới có thể đã được thêm vào.


Không chắc chắn tại sao điều này không làm việc cho tôi, tôi đã phải xóa thủ công tất cả các kích hoạt trong bàn làm việc của tôi.
dùng752746


34

Tạo người dùng đã xóa như thế này:

mysql> create user 'web2vi';

hoặc là

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

3
sau khi tạo người dùng bị bỏ lỡ đó, đã gặp phải một lỗi khác: ERROR 1142 (42000): TRIGGER command denied to user 'web2vi'@'%' for table 'foo'và nên thêm lệnh này grant all on *.* to 'web2vi'@'%' identified by ''sau khi tạo người dùng
zhuguowei 2/2/2016

31

Thực hiện theo các bước sau:

  1. Truy cập PHPMyAdmin
  2. Chọn cơ sở dữ liệu của bạn
  3. Chọn bảng của bạn
  4. Trên menu trên cùng Nhấp vào 'Triggers'
  5. Nhấp vào 'Chỉnh sửa' để chỉnh sửa kích hoạt
  6. Thay đổi definer từ [user @ localhost] thành root @ localhost

Hy vọng nó giúp


1
Đây là giải pháp thực tế cho câu hỏi, thay vì tạo người dùng và cấp quyền. Chỉ cần thay đổi definer.
Ankit Chauhan

Có cách nào để tìm tất cả các kích hoạt trong cơ sở dữ liệu?
Mrugesh Mology

1
Tìm tất cả các kích hoạt: HIỂN THỊ TRIGGERS
JerzySkalski

Từ dòng lệnh 'hiển thị trình kích hoạt', từ PhpMyAdmin chọn cơ sở dữ liệu và sau đó ở phía trên bên phải của thanh điều hướng, nhấp vào trình kích hoạt
hussainfrotan

21

Giải pháp chỉ là một truy vấn dòng đơn như dưới đây:

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

Thay thế ROOT bằng tên người dùng mysql của bạn. Thay thế PASSWORDbằng mật khẩu mysql của bạn.


1
Hãy cẩn thận: Người dùng MySQL là trường hợp nhạy cảm.
Alessio Cantarella

Tôi cần phải flush privilegessau này và nó hoạt động. Cảm ơn.
Victor

14

Đã sửa lỗi bằng cách chạy bình luận sau đây.

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

nếu bạn nhận được some_otherthay vì web2visau đó bạn phải thay đổi tên cho phù hợp.


13

Đối với những người làm việc trong tương lai: Tôi nhận được một thông báo tương tự đang cố cập nhật bảng trong cơ sở dữ liệu không có lượt xem. Sau khi đào bới, hóa ra tôi đã nhập các kích hoạt trên bảng đó và đó là những thứ được xác định bởi người dùng không tồn tại. Thả các kích hoạt đã giải quyết vấn đề.


Kích hoạt là vấn đề, tôi đã cập nhật definer trong phần kích hoạt. không có vấn đề nữa.
Darius

Cảm ơn, nó rất hữu ích. Cũng cần cập nhật quan điểm.
toxxxa

Quả thực rất hữu ích :) Tôi sẽ không bao giờ tìm thấy điều đó một mình.
ElChupacabra


7

sửa chữa nhanh để làm việc xung quanh và kết xuất tập tin:

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

1
cái này không hoạt động các definer được chứa trong bãi chứa.
phil294

Nếu bạn sử dụng mysqlpump với "p" thay vì "d", bạn có thể sử dụng --skip-definer
Wouter

@lyhong Tôi không có lời giải thích chi tiết, nhưng rõ ràng --single-transactionthay đổi cách thức thực hiện Khóa bàn trong khi đổ. Hoặc điều tương tự. Tôi không nhớ mình đã đọc nó ở đâu, nhưng điều đó giúp tôi cảm thấy thoải mái với "chỉ cần ném cờ vào". Tôi cũng cảm thấy khó chịu với "không giải thích được" chỉ cần làm điều này "" câu trả lời ". Dù bằng cách nào, nó đã làm việc cho trường hợp của tôi.
SherylHohman

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

thí dụ:

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

Nếu tôi cấp tất cả các đặc quyền cho một 'người dùng' @ 'tất cả các ips' thì còn bảo mật thì sao ?? !!
Mohsen Abasi

@MohsenAbasi Đây là một ví dụ cho môi trường phát triển. Người dùng này có thể là quản trị viên hệ thống. Môi trường prod cần phải cẩn thận hơn.
mesutpiskin

7

Điều này xảy ra với tôi sau khi chuyển DB từ máy chủ này sang máy chủ khác. Ban đầu, definer đang sử dụng localhost và người dùng. Trên máy chủ mới, chúng tôi không có người dùng đó và máy chủ cũng đã được thay đổi. Tôi đã sao lưu bảng cụ thể đó và xóa tất cả các kích hoạt thủ công khỏi phpmyadmin . Sau đó nó đã làm việc tốt cho tôi.


Cảm ơn vì mẹo này, tôi đã có thể xóa thủ công tất cả các kích hoạt trong bàn làm việc của myQuery.
dùng752746

Đây thực sự là một vấn đề kích hoạt đối với tôi, tôi đã phải loại bỏ và tạo lại tất cả
paul.ago

Có giải pháp nào khác ngoài việc kích hoạt lại không? Tôi đang sử dụng bãi thử nghiệm đôi khi hai lần một ngày. điều này sẽ phá vỡ các quy trình chính của tôi
tái cấu trúc

@TS Guhan bạn đã thêm lại các kích hoạt sau khi bạn loại bỏ chúng bằng tay?
MailBlade

6

Tôi gặp vấn đề tương tự với người dùng root và nó hoạt động với tôi khi tôi thay thế

root@%

bởi

root@localhost

Vì vậy, nếu người dùng 'web2vi' được phép kết nối từ 'localhost', bạn có thể thử:

web2vi@localhost

Tôi được kết nối từ xa đến cơ sở dữ liệu.


4

5 xu của tôi.

Tôi đã có lỗi tương tự trong khi tôi cố gắng chọn từ một khung nhìn.

Tuy nhiên, vấn đề dường như là chế độ xem này, được chọn từ chế độ xem khác được khôi phục từ bản sao lưu từ máy chủ khác.

và trên thực tế, CÓ, người dùng không hợp lệ, nhưng không rõ ràng từ đâu ngay từ cái nhìn đầu tiên.


4

Tôi đã gặp vấn đề tương tự của bạn vài phút trước, tôi đã gặp phải vấn đề này sau khi xóa một người dùng không sử dụng khỏi bảng mysql.user, nhưng thực hiện một chế độ xem thay đổi đã khắc phục nó, đây là một lệnh tiện dụng giúp nó rất đơn giản:

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

Trộn cái này với dòng lệnh mysql (giả sử * nix, không quen thuộc với windows):

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

Lưu ý: lệnh tạo và thêm CHỌN CONCAT trên tệp, mysql -uuser -ppass databasename < alterView.sqlsẽ thất bại nếu bạn không xóa nó.

Nguồn: /dba/4129/modify-definer-on-many-view


4

Cố gắng đặt thủ tục của bạn là SECURITY INVOKER

Mặc định Mysql đặt thủ tục bảo mật là "DEFINER" (CREator OF) .. bạn phải đặt bảo mật thành "invoker".


3

Chế độ xem của bạn, "view_quotes" có thể đã được sao chép từ một cơ sở dữ liệu khác trong đó "web2vi" là người dùng hợp lệ vào cơ sở dữ liệu trong đó "web2vi" không phải là người dùng hợp lệ.
Thêm người dùng "web2vi" vào cơ sở dữ liệu hoặc thay đổi chế độ xem (thường loại bỏ phần DEFINER = 'web2vi' @ '%' và thực thi tập lệnh sẽ thực hiện thủ thuật)


3

Trong trường hợp của tôi, bảng có một trình kích hoạt với người dùng DEFINER không tồn tại.


2
ngay trên móng đặc biệt khi ứng dụng được chuyển từ máy chủ sang máy chủ khác
zardilior 19/03/2015

2

Từ tài liệu tham khảo của MySQL về CREATE VIEW:

Các mệnh đề DEFINER và SQL AN NINH chỉ định bối cảnh bảo mật sẽ được sử dụng khi kiểm tra các đặc quyền truy cập tại thời điểm gọi.

Người dùng này phải tồn tại và luôn luôn tốt hơn để sử dụng 'localhost' làm tên máy chủ. Vì vậy, tôi nghĩ rằng nếu bạn kiểm tra xem người dùng có tồn tại và thay đổi nó thành 'localhost' trên chế độ xem thì bạn sẽ không gặp lỗi này.


2

Vấn đề đã rõ ràng - MySQL không thể tìm thấy người dùng được chỉ định làm công cụ khử.

Tôi đã gặp vấn đề này sau khi đồng bộ hóa mô hình cơ sở dữ liệu từ máy chủ phát triển, áp dụng nó vào localhost, thực hiện các thay đổi cho mô hình và sau đó áp dụng lại nó vào localhost. Rõ ràng có một khung nhìn (tôi đã sửa đổi) được xác định và vì vậy tôi không thể cập nhật phiên bản địa phương của mình.

Cách khắc phục (dễ dàng) :

Lưu ý: nó liên quan đến việc xóa để nó hoạt động tốt cho các chế độ xem nhưng đảm bảo bạn đã sao lưu dữ liệu nếu bạn thử điều này trên các bảng.

  1. Đăng nhập vào cơ sở dữ liệu dưới dạng root (hoặc bất cứ điều gì có đủ sức mạnh để thực hiện thay đổi).
  2. Xóa chế độ xem, bảng hoặc bất cứ điều gì bạn đang gặp khó khăn.
  3. Đồng bộ hóa mô hình mới của bạn - nó sẽ không phàn nàn về thứ gì đó không tồn tại bây giờ. Bạn có thể muốn xóa SQL DEURIN DEFINER khỏi định nghĩa mục mà bạn gặp vấn đề.

PS Đây không phải là một sửa chữa thích hợp cũng như tốt nhất xung quanh. Tôi chỉ đăng nó như là một giải pháp có thể (và rất đơn giản).


Tôi đang sử dụng cóc, cn tôi xóa và tạo lại bằng cách sử dụng os mà tôi nên đăng nhập như rooy từ thiết bị đầu cuối và sau đó chỉ làm gì ??
Vasanth Nag KV

2

Bạn có thể thử điều này:

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

2

Tại sao tôi nhận được lỗi đó? Làm thế nào để tôi sửa nó?

Tôi đã dành một giờ trước khi tìm thấy một quyết định cho một vấn đề như thế này. Nhưng, trong trường hợp của tôi, tôi đã chạy nó:

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

Nếu bạn thực sự muốn tìm ra vấn đề, chỉ cần chạy từng lệnh một:

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

... và, sau mỗi người trong số họ, hãy tìm trường 'definer'.

Trong trường hợp của tôi, nó là bộ kích hoạt cũ, mà ai đó của các nhà phát triển đã quên xóa.


1

Đi vào phần chỉnh sửa thường trình và ở phía dưới, thay đổi Loại bảo mật từ Definer thành Invoker.


4
Đi đến nơi? Trong phần mềm nào?
kenorb

@kenorb, trong phpMyAdmin, bạn có thể thay đổi các thói quen được lưu trữ (quy trình và chức năng) của MySQL, ví dụ: Loại bảo mật.
Mikl

1

Một hoặc một số quan điểm của bạn nơi người dùng khác tạo / đăng ký. Bạn sẽ phải kiểm tra chủ sở hữu của chế độ xem và:

  1. Tái tạo người dùng; như những câu trả lời khác nói hoặc là
  2. Tái tạo các chế độ xem được tạo bởi người dùng 'web2vi'bằng ALTER VIEW

Tôi đã có vấn đề này một lần.

Tôi đã cố gắng di chuyển các khung nhìn, từ BD1 sang BD2, bằng SQLYog. SQLYog đã tạo lại các khung nhìn trong DataBase khác (DB2), nhưng nó giữ người dùng của BD1 (chúng khác nhau). Sau đó tôi nhận ra rằng các chế độ xem tôi đang sử dụng trong truy vấn của mình có cùng lỗi với bạn, ngay cả khi tôi không tạo bất kỳ chế độ xem nào.

Hy vọng điều này giúp đỡ.


1

Nếu đây là một thủ tục được lưu trữ, bạn có thể làm:

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

Nhưng điều này không được khuyên.

Đối với tôi, giải pháp tốt hơn là tạo ra definer:

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

Bạn có một lỗi trong cú pháp SQL của bạn; kiểm tra hướng dẫn tương ứng với phiên bản máy chủ MySQL của bạn để biết đúng cú pháp để sử dụng gần 'cấp tất cả trên' mytable '. * cho' myuser 'được xác định bởi' mypass ';' tại dòng 1
Cerin

@Cerin, chỉ cần thay đổi '' xung quanh mytable thành ``. Câu trả lời của tôi nhằm giúp mọi người giải quyết vấn đề này .. Hãy nghĩ đến việc xem xét lại downvote của bạn ..
helpse

1

Khi mysql.proc trống, nhưng hệ thống luôn chú ý "user@192.168.%" đối với tên_bảng không tồn tại, bạn chỉ cần root trong dòng lệnh mysql và gõ:

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

kết thúc!


1

Điều này đã xảy ra với tôi sau khi tôi nhập kết xuất trên Windows 10 với Cộng đồng MYSQL Workbench 6.3, với "root @% không tồn tại". Mặc dù người dùng đã tồn tại. Đầu tiên tôi đã cố gắng nhận xét DEFINER tuy nhiên, điều này không hoạt động. Sau đó, tôi đã thay thế một chuỗi trên "root @%" bằng "root @ localhost" và nhập lại kết xuất. Điều này đã lừa tôi.



0

Người dùng cơ sở dữ liệu dường như cũng phân biệt chữ hoa chữ thường, vì vậy trong khi tôi có người dùng root '@'% thì tôi không có người dùng ROOT '@'%. Tôi đã thay đổi người dùng thành chữ hoa thông qua bàn làm việc và vấn đề đã được giải quyết!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.