Используя Microsoft SQL Management Studio, установите зависимость от пользовательской функции
Итак, есть пара проблем, с которыми я сталкиваюсь, чтобы заставить это работать. Вот функция:
CREATE FUNCTION RSO_Affiliation_AdminID_is_Admin_Enforcer
@Admin_ID nvarchar(50)
RETURNS INT
AS
BEGIN
DECLARE @ACCESS nvarchar(50)
SET @ACCESS = (SELECT ACCESS FROM Student WHERE USER_ID = @ADMIN_ID)
IF (@ACCESS LIKE 'Admin')
RETURN 1;
IF (@ACCESS LIKE 'SuperAdmin')
RETURN 1;
RETURN 0;
END
GO
Я довольно новичок в SQL и студии управления SQL-сервером, поэтому, если здесь вообще что-то не так с синтаксисом, это будет основной проблемой, но, насколько я видел, это должно работать. По сути, это должно вызываться ограничением для таблицы RSO_Affiliation с новым ADMIN_ID в качестве параметра, оно должно проверять его по таблице Student и возвращать 1, если выясняется, что уровень доступа для соответствующего USER_ID является администратором некоторого вида верните 0 в противном случае.
Проблема 1 в том, что я не могу найти эту функцию в обозревателе объектов. Несмотря на многократное сохранение, обновление и повторное подключение к БД, она отсутствует во всех папках Function. Он сохранен в папке SQL Management Studio в папке "Мои документы", но, насколько я знаю, моя фактическая база данных не знает о ее существовании. Кстати, я создал ее как скалярную функцию.
Проблема 2 в том, что я не знаю синтаксис того, что я должен ввести в диалоговое окно RSO_Affiliation -> Check Constraints -> Expression. Из того, что я видел из других вопросов,
dbo.RSO_Affiliation_AdminID_is_Admin_Enforcer(ADMIN_ID) = 1
должен работать, но это не так, вероятно, потому что, опять же, я не думаю, что моя база данных знает, где искать саму функцию.
Есть идеи?
РЕДАКТИРОВАТЬ Итак, я наконец-то понял, что для того, чтобы SMSS добавил функцию в БД, вам нужно протестировать ее с помощью кнопки "Выполнить" в верхнем левом углу панели инструментов. Я смог использовать его в меню ограничений с приведенным выше кодом без проблем, за исключением одного:
Очевидно, он ничего не делает. Предположительно, это вызвано ограничением с ожидающим ADMIN_ID, но я могу использовать студентов с уровнями доступа без прав администратора для создания новых RSO. Есть идеи, почему это может иметь место?
1 ответ
Вы можете делать то, что вы хотите с ограничениями внешнего ключа, предполагая, что user_id
уникален в student
, Это избавляет от проблем с пользовательской функцией, но в реализации есть несколько ошибок.
Во-первых, вам нужен уникальный ключ для студентов, чтобы определить, кто является администратором или супер администратором:
alter table student add IsAdmin as (case when ACCESS in ('Admin', 'SuperAdmin') then 1 else 0 end);
create unique index unq_Student_IsAdmin on Student(user_id, IsAdmin);
Затем создайте ограничение внешнего ключа в таблице, о которой вы заботитесь:
alter table t add IsAdmin (1);
alter table t add constraint fk_t_student_isadmin
foreign key (admin_id, IsAdmin) references student(user_id, IsAdmin);
Это гарантирует, что admin_id
в таблице вы настраиваете админа.