2017-11-09 1 views
0

SaaS 웹 애플리케이션 용 멀티 테넌트 데이터베이스가 있습니다. 클라이언트 당 10GB 데이터 저장 용량 한도를 설정하고 싶습니다. SQL Azure에서이 제한을 어떻게 적용합니까? 나는 SaaS 회사가 그런 한계를 두는 것을 보았지만, 1 클라이언트가 데이터베이스에서 얼마나 많은 스토리지를 소비했는지 측정하는 방법은 무엇입니까? 데이터를 분리하는SaaS 데이터베이스에서 1 클라이언트가 저장 한 데이터를 측정하는 방법

텍사스

답변

1

하나의 옵션은 세입자 당 별도의 스키마를하는 것입니다. 그리고 아래 스크립트를 사용하여 스키마의 크기를 측정 할 수 있습니다.

SET NOCOUNT ON 
declare @SourceDB sysname 
DECLARE @sql nvarchar (4000) 

IF @SourceDB IS NULL BEGIN 
    SET @SourceDB = DB_NAME() -- The current DB 
END 


CREATE TABLE #Tables ( [schema] sysname 
         , TabName sysname) 

SELECT @sql = 'insert #tables ([schema], [TabName]) 
        select TABLE_SCHEMA, TABLE_NAME 
        from ['+ @SourceDB +'].INFORMATION_SCHEMA.TABLES 
         where TABLE_TYPE = ''BASE TABLE''' 
EXEC (@sql) 


--------------------------------------------------------------- 
-- #TabSpaceTxt Holds the results of sp_spaceused. 
-- It Doesn't have Schema Info! 
CREATE TABLE #TabSpaceTxt (
         TabName sysname 
         , [Rows] varchar (11) 
         , Reserved varchar (18) 
         , Data varchar (18) 
         , Index_Size varchar (18) 
         , Unused varchar (18) 
         ) 

--------------------------------------------------------------- 
-- The result table, with numeric results and Schema name. 
CREATE TABLE #TabSpace ([Schema] sysname 
         , TabName sysname 
         , [Rows] bigint 
         , ReservedMB numeric(18,3) 
         , DataMB numeric(18,3) 
         , Index_SizeMB numeric(18,3) 
         , UnusedMB numeric(18,3) 
         ) 

DECLARE @Tab sysname -- table name 
     , @Sch sysname -- owner,schema 

DECLARE TableCursor CURSOR FOR 
    SELECT [SCHEMA], TabNAME 
     FROM #tables 

OPEN TableCursor; 
FETCH TableCursor into @Sch, @Tab; 

WHILE @@FETCH_STATUS = 0 BEGIN 

    SELECT @sql = 'exec [' + @SourceDB 
     + ']..sp_executesql N''insert #TabSpaceTxt exec sp_spaceused ' 
     + '''''[' + @Sch + '].[' + @Tab + ']' + ''''''''; 

    Delete from #TabSpaceTxt; -- Stores 1 result at a time 
    EXEC (@sql); 

    INSERT INTO #TabSpace 
    SELECT @Sch 
     , [TabName] 
     , convert(bigint, rows) 
     , convert(numeric(18,3), convert(numeric(18,3), 
       left(reserved, len(reserved)-3))/1024.0) 
       ReservedMB 
     , convert(numeric(18,3), convert(numeric(18,3), 
       left(data, len(data)-3))/1024.0) DataMB 
     , convert(numeric(18,3), convert(numeric(18,3), 
       left(index_size, len(index_size)-3))/1024.0) 
       Index_SizeMB 
     , convert(numeric(18,3), convert(numeric(18,3), 
       left(unused, len([Unused])-3))/1024.0) 
       [UnusedMB] 
     FROM #TabSpaceTxt; 

    FETCH TableCursor into @Sch, @Tab; 
END; 

CLOSE TableCursor; 
DEALLOCATE TableCursor; 


select [SCHEMA],SUM(ReservedMB)SizeInMB from #TabSpace 
group by [SCHEMA] 
+0

알베르토의 답변 외에도. 주어진 데이터베이스에서 특정 클라이언트 (SQL 용어의 사용자)에게 할당 된 메모리 양을 제한하는 것은 현재 불가능합니다. –

관련 문제