2013-04-08 5 views
1

Я пытаюсь предоставить разрешения доступа определенному пользователю, у которого есть доступ к «менеджеру». Они могут SELECT и UPDATE, но только для людей в их собственной группе. БД составляет redflame, а таблица payroll.Разрешение гранта MySQL на основе значения столбца?

Часть таблицы такова:

+------+---------+--------+-----------+--------+ 
| Dept | Manager | Name | Birthdate | Salary | 
+------+---------+--------+-----------+--------+ 
| 1 | Y  | BOB | 1/1/1  | 50000 | 
| 1 | N  | BILL | 2/2/2  | 40000 | 
| 1 | N  | BART | 3/3/3  | 70000 | 
| 2 | Y  | JIM | 4/4/4  | 40000 | 
| 2 | N  | JANET | 5/5/5  | 50000 | 
... 

Я хотел, чтобы только SELECT и UPDATE привилегии менеджера, но только в своей группе. Я попробовал,

GRANT SELECT (Dept, Manager, Name, Birthdate), 
     UPDATE (Dept, Manager, Name, Birthdate) 
    ON redflame.payroll WHERE Dept = '1' 
    TO 'Bob'@'localhost'; 

Я знаю, что это не будет работать, но как можно реализовать Bob «s разрешения на основе его Dept?

Любая помощь была бы принята с благодарностью.

ответ

0

Создайте представление для каждого отдела и предоставите ему привилегии.

+0

Благодарим за предложение. Я получил этот код для работы: 'CREATE VIEW Dept1 as SELECT * FROM redflame.payroll WHERE Dept = '1';' и затем смог реализовать обычные привилегии «GRANT». Я также нашел предложение в другой статье [ЗДЕСЬ] (http://stackoverflow.com/questions/1840494/does-deleting-row-from-view-delete-row-from-base-table-mysql), где он указывает ' Некоторые виды обновляются. То есть вы можете использовать их в таких инструкциях, как UPDATE, DELETE или INSERT, чтобы обновить содержимое базовой таблицы. ' – jarsever

0

Согласно MySQL инструкции:

http://dev.mysql.com/doc/refman/5.1/en/grant.html

Как правило, администратор базы данных использует первый CREATE USER для создания учетной записи, а затем GRANT определить свои привилегии и характеристики.

В вас PHP-код, когда вы добавляете новую запись в таблицу начисления заработной платы, необходимо сделать следующее (я пишу в псевдокоде):

if((new->Dept == 1) and (new->Manager == 'Y')) 
{ 
     if (user with name == new->Name doesn't exist) 
     { 
      Create a new user with name = new->Name 
      Grant SELECT and UPDATE privileges to the newly created user ON redflame.payroll table 
     } 
     else 
     { 
      error: user already exists! 
     } 
} 

При обновлении записи в начисление заработной платы таблица:

if(the record was a Manager and he is updated to non Manager) 
{ 
     DROP USER with name = old->Name 
} 

if(the record was not a Manager and he is updated to Manager) 
{ 
     if (user with name == new->Name doesn't exist) 
     { 
      Create a new user with name = new->Name 
      Grant SELECT and UPDATE privileges to the newly created user ON redflame.payroll table 
     } 
     else 
     { 
      error: user already exists! 
     } 
} 

При удалении записи из таблицы заработной платы:

if((old->Dept == 1) and (old->Manager == 'Y')) 
{ 
     if (user with name == old->Name exists) 
     { 
      DROP USER with name = old->Name 
     } 
} 

Если у вас есть root-доступ к базе данных, вы можете создать триггеры ON INSERT, ON UPDATE и ON DELETE. Затем используйте эту логику, написав код SQL. В противном случае реализуйте его в php.