2013-07-31 9 views
0

Можно ли отключить возможность обновления столбца первичного ключа на глобальном уровне с помощью глобальной переменной сеанса или сервера?mysql - глобальное отключенное обновление столбца первичного ключа

Или мне нужно вручную проверить его как триггер обновления в каждой таблице?

+1

Так что вы пытаетесь делать? –

+0

Извините за мое невежество, насколько именно «обновление первичного ключа»? –

+0

@Sylvain Leroux: Я думаю, что это относится к 'UPDATE', который устанавливает значение столбца, содержащегося в ограничении PRIMARY KEY, новому значению. – spencer7593

ответ

1

Нет. Запретить обновление столбца, который является частью ограничения «первичного ключа», невозможно, используя глобальный сервер, сеанс и т. Д. переменная.

Если вы хотите, чтобы инструкция UPDATE не вносила изменения, вы можете попробовать применить это с помощью триггера ДОПОЛНЕНИЕ на каждой таблице.

SET NEW.primary_key_col = OLD.primary_key_col; 

Followup:

dmjm говорит: "я предпочел бы бросить ошибку ..."

Бросать ошибку из триггера с использованием MySQL 5.5 или более поздней версии, может использовать новый синтаксис SIGNAL.

С MySQL 5.1 или ранее нет прямого способа выбросить ошибку, поэтому разработчики внедрили «плохой» код, который выполняется (фактически), гарантируя, что возникла ошибка.

IF (NEW.primary_key_col <> OLD.primary_key_col) THEN 
    UPDATE `Error: primary_key_col modification not allowed` SET dummy=0 WHERE dummy=-1; 
END IF; 
+0

Я предпочел бы передать сигнал ошибки, так как другие столбцы также могут быть обновлены внутри одного и того же оператора. – djmj

4

В качестве дополнения к ответу spencer7593, если вы управляете себе пользователей вашей БД, вы всегда можете «защитить» некоторые столбцы с помощью REVOKE:

REVOKE UPDATE (primary_key_col) ON db.tbl FROM 'user'@'localhost' 
+0

Приятно знать +1 – djmj

Смежные вопросы