У меня есть база данных с именем MyDB в экземпляре Microsoft SQL Server 2008 Express с использованием аутентификации смешанного режима.Приложение, использующее базу данных MyDB, в настоящее время подключается с использованием аутентификации Windows, используя учетные данные текущего пользователя Windows.Этот логин является членом «общедоступной» роли сервера, и для него назначен пользователь в базе данных MyDB.Этот пользователь базы данных является членом ролей базы данных db_datareader и db_datawriter.
Я хотел бы, чтобы при подключении приложения у него были разрешения на чтение и запись в MyDB.Но когда другое приложение подключается с использованием того же имени входа, ему разрешается только чтение.
Я думал, что я создам триггер входа в систему, который будет проверять часть имени приложения в строке подключения и на основекоторые решают, следует ли переключать контекст выполнения.(Кстати, я знаю, что ни в коем случае не безопасно полагаться на имя приложения в строке подключения и что его очень легко обойти. Цель здесь не в том, чтобы защитить базу данных, а чтобы помочь пользователям избежать измененийданные, когда они подключаются с помощью другого приложения, такого как Microsoft Excel)
Я создал новый логин с именем «myapp_reader», сопоставленный с пользователем в базе данных MyDB, которая является членом db_datareader.
Затем я попытался создать триггер входа со следующим TSQL:
CREATE TRIGGER CheckUser
ON ALL SERVER
AFTER LOGON AS
BEGIN
IF APP_NAME() <> 'My Application Name'
BEGIN
EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT
END
END
Но, к сожалению, он не работает.Когда я пытаюсь подключиться, я получаю следующую ошибку:
Ошибка входа в систему для входа в систему «MyComputer \ MyWindowsUsername» из-за выполнения триггера.Изменен контекст базы данных на «мастер».Изменены языковые настройки на us_english.(Microsoft SQL Server, ошибка: 17892)
И когда я просматриваю журнал ошибок, он говорит:
Ошибка: 15590, Серьезность: 16, Состояние: 1.Можно использовать параметры «Нет возврата» или «Cookie» только с оператором «Выполнить как» на уровне adhoc.Ошибка: 17892, серьезность: 20, состояние: 1.Ошибка входа для входа «MyComputer \ MyWindowsUsername» из-за выполнения триггера.[КЛИЕНТ: xxx.xxx.xxx.xxx]
Означает ли эта ошибка, что я не могу навсегда изменить контекст выполнения в триггере входа в систему?