Используя 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 в таблице вы настраиваете админа.

Другие вопросы по тегам