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