Способ контроля определения таблицы, дублированной в нескольких схемах - PullRequest
0 голосов
/ 21 июня 2011

Мы проектируем новую базу данных, которая будет интенсивно использовать схемы для разделения логических частей нашей базы данных.

В качестве примера можно привести сотрудника и клиента.У нас будет схема для каждой из них, и веб-службы, которые подключаются к одной, не будут допущены в другой.

Когда мы сталкиваемся с проблемами / проблемами, данные кажутся очень похожими между двумя схемами.Например, у сотрудников и клиентов есть адреса.

Мы могли бы сделать что-то вроде common.Address.Но мандат на разделение доступа к данным сервисов достаточно силен.

Так что похоже, что мы пойдем с сотрудником. Адрес и клиент. Адрес.

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

Есть ли что-нибудь подобное в SQL Server.Некоторая таблица типа "тип" или "класс", которая может быть "реализована" в разных схемах.(Я не надеюсь здесь, но я думал, что я спрошу.)

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Мысли, а не жесткий ответ ...

У нас есть

  • общая схема данных
  • просмотров, процедур и т. Д. В схеме для каждого клиента
  • Внутренняя схема "Помощник" для общего кода

Будет ли это работать для вас?

Моя другая мысль - это база данных для каждого клиента. Это проще для разрешения для базы данных, чем для схемы, особенно для прямого доступа к БД, поддержки или типа опытных пользователей

1 голос
/ 21 июня 2011

Я думаю, что вашей лучшей ставкой является триггер DDL, когда вы можете вызвать сбой при изменении любой из ваших "общих" таблиц.

что-то вроде:

CREATE TRIGGER [Dont_Change_CommonTables]
ON DATABASE
FOR DDL_TABLE_EVENTS,GRANT_DATABASE
AS
DECLARE @EventData      xml
DECLARE @Message        varchar(1000)
SET @EventData=EVENTDATA()

IF (@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(50)')='TABLE'
    AND @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(50)') IN ('Address'
                                                                              ,'etc...'
                                                                              --place your table list here
                                                                              )
   )
BEGIN
    ROLLBACK
    SET @Message='Error! you can not make changes to '+ISNULL(LOWER(@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(50)')),'')+': '+ISNULL(@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(50)'),'')
    RAISERROR(@Message,16,1)
    RETURN
END
GO
...