외래 키 제약 조건을 변경하는 데 필요한 최소 권한은 무엇입니까?


12

외래 키 제약 조건을 변경하는 데 필요한 최소 권한은 무엇입니까?

MySQL 5.5.41 이이 버그를 수정 한 후 마이그레이션 스크립트 작동이 중지되었습니다 .

  • InnoDB는 사용자에게 충분한 권한이없는 부모 테이블을 참조하는 외래 키를 만들 수 있도록 허용했습니다. (버그 # 18790730)

이 오류가 발생합니다.

SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1142 REFERENCES 명령이 'core.users'테이블에 대한 'foo'@ 'localhost'사용자에게 거부되었습니다 (SQL : alter table`user_baz` add constraint user_baz_user_id_foreign foreign key (`user_id`) 참조 업데이트 캐스케이드에서 삭제 캐스케이드의`core`.`users` (`id`)

즉, 권한을 수정해야합니다. 필요한 최소 권한은 무엇입니까?

답변:


15

역할에 "REFERENCES"권한을 추가해야합니다.


1
이러한 유형의 "이론적"답변은 실제로 권한을 추가하는 방법에 대한 추가 인터넷 검색으로 이어집니다. 필요한 모든 세부 정보를 제공하는 @Yuci의 답변을 참조하십시오. 즉,GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';
존 시장

8
GRANT [type of permission] ON [database name].[table name] TO '[username]'@'[host name or IP address]';

예를 들면 다음과 같습니다.

GRANT REFERENCES ON test.user_baz TO 'foo'@'localhost';

1

먼저 다른 모든 방법이 실패하면 설명서 (사용 설명서 섹션)를 읽으십시오 .

To use `ALTER TABLE`, you need `ALTER`, `CREATE` and `INSERT` privileges for the table. Note that the user (billy) granted these privileges cannot drop the table.

아래는 예입니다.

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |    <=== now root user
+----------------+
1 row in set (0.00 sec)

mysql> CREATE TABLE a(b VARCHAR(3) PRIMARY KEY); <=== Must be PK to be FK in another table.
Query OK, 0 rows affected (0.28 sec)

mysql> CREATE TABLE c(d VARCHAR(3), KEY c_ix (d));
Query OK, 0 rows affected (0.35 sec)

mysql> GRANT ALTER, CREATE, INSERT ON c TO billy;  <=== Privileges to billy
Query OK, 0 rows affected (0.00 sec)

mysql> exit;
Bye

logon as billy

[pol@localhost dbahelper-master]$ /mysql/5.7/inst/bin/mysql -S /mysql/5.7/inst/mysql.sock -u billy -pdba

mysql> use test;
Database changed
mysql> 
mysql> ALTER TABLE c ADD CONSTRAINT fk_c_a FOREIGN KEY (d) REFERENCES a(b);
Query OK, 0 rows affected (0.64 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE c;
| c     | CREATE TABLE `c` (
  `d` varchar(3) DEFAULT NULL,
  KEY `c_ix` (`d`),
  CONSTRAINT `fk_c_a` FOREIGN KEY (`d`) REFERENCES `a` (`b`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
mysql> 
mysql> drop table c;
ERROR 1142 (42000): DROP command denied to user 'billy'@'localhost' for table 'c'
mysql> 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.