Неужели все пользователи должны обращаться к MS SQL под одним SQL-пользователем? Как разграничить доступ на уровне MS SQL.

Загрузить

change_owner.sql - скрипт Михаила Андронова, который изменяет владельца объектов базы данных c bmssa на пользователя [dbo].

Описание проблемы

При первом запуске, Аксапта сама создает необходимые таблицы в базе данных. При создании она указывает в качестве владельца всех таблиц не пользователя dbo, а пользователя базы данных (по-умолчанию, bmssa).

В результате, Аксапта не может работать, если обращаться к MS SQL от имени другого пользователя. Не будет она работать даже в том случае, если "другому пользователю" дать роль db_owner.

Решение

Решение состоит в том, что изменить владельца объектов базы данных на [dbo]. Как только у таблиц, view и других объектов в качестве владельца будет указан владелец [dbo], то можно создать несколько пользователей, дать им роль db_owner и... Аксапта будет нормально работать от имени этих пользователей.

Средствами MS SQL для разных пользователей можно дать различные права на разные таблицы. Так например, все кладовщики будут авторизоваться на MS SQL, например, от пользователя Invent, все представители отдела продаж будут входить, например, от пользователя Sales. И т.п.

Скрипт, который изменяет владельца для объектов базы данных:

declare @@name nvarchar(517)


declare tables cursor for
select
       u.name + '.' + o.name
from
       sysobjects o inner join
       sysusers u on (o.uid = u.uid)
where
       type in ('U', 'V') and u.name = 'bmssa'
                                 -- Имя ^^^^^ надо заменить на соответствующее
open tables


fetch from tables into @@name
while @@fetch_status = 0
begin
      exec sp_changeobjectowner @@name, 'dbo'
      fetch from tables into @@name
end


close tables
deallocate tables 

Чтобы скрипт нормально сработал, вы должны войти от пользователя bmssa или от пользователя, который входит в роль db_securityadmin и db_ddladmin.

Примечание: В качестве побочного эффекта, данный скрипт полностью решает проблему, описанную в совете Invalid object Name 'SQLSystemVariables'. Что делать?

Примечание: Надо признать, что аналогичный скрипт еще в ноябре 2001 года опубликовал Максим Горбунов на axforum. Однако, Максим предлагал это решение именно как средство борьбы с SQLSystemVariables, а не как инструмент для разграничения прав доступа на MS SQL.

 

Буду рад Вашим замечаниям и предложениям.
E-Mail: mazzy@mazzy.ru, Мазуркин Сергей