Многоэтапная хранимая процедура SQL Server - PullRequest
0 голосов
/ 25 октября 2011

У меня есть программный комплекс, основанный на нескольких библиотеках, где:

1 библиотека = 1 база данных SQL.

Разные пользователи могут иметь разный доступ к разным библиотекам.

Кроме того, базы данных именуются определенным образом, чтобы помочь определить, какие из них «мои», а какие нет.

Я хотел бы создать хранимую процедуру, которая принимает переменную с именем @UserName и возвращает базы данных, имена которых начинаются с MYDB, где @UserName находится в таблице USERS.

Я рассчитываю, что начну с EXEC sp_databases, ноЯ не уверен, как продолжить.

Что мне нужно знать, это:

  1. Как мне перебрать результаты sp_databases, чтобы вытащить только те базы данных, имя которых совпадает с моимpattern?
  2. Как мне тогда проверить @UserName в столбце [USER NAME] таблицы USERS каждой базы данных, возвращенной из # 1?

Я предполагаюэто как-то связано с временными таблицами и курсорами, но я не совсем уверен, гдедля начала.

Любая помощь?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Вот некоторые доказательства концепции кода, чтобы показать вам подход.sys.databases содержит более доступный список баз данных.Вам в значительной степени придется использовать динамический sql в какой-то момент.

CREATE PROCEDURE MyDBs @userName VARCHAR(255)
AS
BEGIN

DECLARE @max INT
DECLARE @i INT 
DECLARE @sql VARCHAR(500)

CREATE TABLE #SQL
(
    rid int identity primary key clustered,
    query varchar(500)
)

INSERT INTO #SQL(query)
SELECT 'SELECT * FROM ['+ name '+].USERS WHERE username = @UserName'
FROM master.sys.databases
WHERE NAME LIKE '%yourpattern%'

SELECT @max = @@rowcount, @i = 1

WHILE @i <= @max
BEGIN
     SELECT @sql = query FROM #sql WHERE rid = @i
     EXEC @sql
     SET @i = @i + 1
END 

DROP TABLE #SQL
1 голос
/ 25 октября 2011

Для 1 просто посмотрите на код sp_databases, скопируйте его и измените его в соответствии со своими потребностями. Например (см. Последние 2 условия условия where. Это фактический код хранимой процедуры sp_database. Вы можете посмотреть его на главной базе данных):

declare @UserName varchar(50)='someuser'
select
        DATABASE_NAME   = db_name(s_mf.database_id),
        DATABASE_SIZE   = convert(int,
                                    case -- more than 2TB(maxint) worth of pages (by 8K each) can not fit an int...
                                    when convert(bigint, sum(s_mf.size)) >= 268435456
                                    then null
                                    else sum(s_mf.size)*8 -- Convert from 8192 byte pages to Kb
                                    end),
        REMARKS         = convert(varchar(254),null)
    from
        sys.master_files s_mf
    where
        s_mf.state = 0 and -- ONLINE
        has_dbaccess(db_name(s_mf.database_id)) = 1 and
        --db_name(s_mf.database_id) like '%'+@UserName+'%' and exists -- you may or may not want to leave this condition here. You'll figure out what condition to use
        (select 1 from databasename.dbo.Users where [UserName]=@UserName)
    group by s_mf.database_id
     order by 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...