Posts
400
Comments
213
Trackbacks
0
Eine Datenbank um Mandantenfähigkeit erweitern

Manchmal kommt es vor, dass eine bestehende produktive Software für die Nutzung durch mehrere Mandanten oder Kunden erweitert werden soll.

Als „Mandantenfähigkeit” bezeichnet man die Eigenschaft einer Software, auf einer Installation mehrere voneinander vollständig getrennte Mandanten/Kunden abzubilden. Die jeweiligen Mandanten nutzen hierbei die gleiche Programmlogik und -funktionen, haben aber jeweils eine eigene Datenbasis und können die Daten der anderen Mandanten nicht einsehen.

Hier ein Beispiel SQL-Skript welches eine Tabelle Mandanten anlegt und alle vorhandenen Tabellen um eine Spalte Mandanten_ID erweitert und einen foreign-key auf die Tabelle Mandanten setzt:

DECLARE @MandantTabelle nvarchar(200)
SET @MandantTabelle = '_Mandanten'
DECLARE @statement nvarchar(4000)
DECLARE @MandantID nvarchar(200)
SET @MandantID = 'Mandant_ID'
DECLARE @NameFK nvarchar(200)
 

-- zuerst Mandaten-Tabelle anlegen
IF NOT EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=@MandantTabelle )
      BEGIN
            set @statement = N'
                  CREATE TABLE [dbo].[_Mandanten](
                        [MANDANT_ID] [int] NOT NULL,
                        [Name] [nvarchar](100) NULL,
                        [Bemerkung] [nvarchar](max) NULL,
                        [LastMod] [datetime] NULL,
                        [LastUser] [nvarchar](50) NULL,
                   CONSTRAINT [PK__Mandanten] PRIMARY KEY CLUSTERED 
                  (
                        [MANDANT_ID] ASC
                  )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
                  ) ON [PRIMARY]'
            EXECUTE sp_executesql @statement 
            PRINT 'Die Tabelle ' + @MandantTabelle +' war nicht vorhanden, wurde angelegt'
      END
ELSE
      PRINT 'Die Tabelle ' + @MandantTabelle +' ist bereits vorhanden'

PRINT ' '


-- in alle Tabellen das Feld MandantenID hinzufügen (wenn nicht vorhanden)
-- und einen foreign key auf die Tabelle Mandant setzen (wenn nicht vorhanden) 
SET NOCOUNT ON

PRINT 'alle Tabellen um die Spalte ' + @MandantID + ' erweitern:'
PRINT 'Start:  ' + convert(varchar, current_timestamp, 121)
PRINT ' ' 

DECLARE @curTabellen CURSOR
DECLARE @tabelle nvarchar(200) 

SET @curTabellen = CURSOR FOR
      SELECT TABLE_NAME
        FROM INFORMATION_SCHEMA.TABLES 
       WHERE (TABLE_NAME NOT IN ('dtproperties', 'sysdiagrams','_Mandanten','grant_definition')) AND (TABLE_TYPE = 'BASE TABLE')
       ORDER BY TABLE_NAME     

OPEN @curTabellen
FETCH NEXT FROM @curTabellen INTO @tabelle 

WHILE @@FETCH_STATUS = 0
BEGIN

      PRINT @tabelle 

      -- Wenn Feld MandantID nicht vorhanden, dann anlegen (wenn nicht vorhanden)
      If NOT Exists 
      (Select * From Information_Schema.Columns Where Table_Name = @tabelle And Column_Name = @MandantID) 
            BEGIN
                  SET @statement = N'ALTER TABLE ' + @tabelle + ' ADD ' + @MandantID + ' INT'
                  EXECUTE sp_executesql @statement 
                  print '- Feld ' + @MandantID + ' war nicht vorhanden, wurde angelegt' 
            END
      ELSE
            PRINT '- Feld ' + @MandantID + ' ist bereits vorhanden'

  

      -- foreign key auf die Tabelle _Mandant setzen (wenn nicht vorhanden)
      SET  @NameFK = 'FK_' + @tabelle + '_' + @MandantTabelle

      If NOT Exists 
      (SELECT * FROM Information_Schema.CONSTRAINT_COLUMN_USAGE
      WHERE TABLE_NAME = @tabelle and CONSTRAINT_NAME=@NameFK)
            BEGIN 

                  SET @statement = N'ALTER TABLE ' + @tabelle + '  
                        WITH CHECK ADD  CONSTRAINT [' + @NameFK + '] 
                        FOREIGN KEY([' + @MandantID + '])
                        REFERENCES [dbo].[' + @MandantTabelle + '] ([' + @MandantID + '])'
                  EXECUTE sp_executesql @statement 

                  Print '- FK zur Tabelle ' + @MandantTabelle + ' war nicht vorhanden, wurde angelegt'
            END
      ELSE
            Print '- FK zur Tabelle ' + @MandantTabelle + ' ist bereits vorhanden'

      PRINT ' '
      FETCH NEXT

      FROM @curTabellen INTO @tabelle

END

CLOSE @curTabellen
DEALLOCATE @curTabellen 

PRINT 'Ende'
SET NOCOUNT OFF
 

posted on Thursday, December 02, 2010 10:21 AM Print
Comments
No comments posted yet.

Post Comment

Title *
Name *
Email
Url
Comment *  
Please add 3 and 7 and type the answer here: