IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Obliger la création de table sur un filegroup spécifique


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Par défaut Obliger la création de table sur un filegroup spécifique
    Bonjour,
    Voici mon besoin : Je souhaite, pour certains users, ajouter des droits de création de table. Mais uniquement sur un filegroup particulier qui n'est pas celui par défaut .
    Lorsque l'on fait un CREATE TABLE , si le filegroup n'est pas spécifié il se place sur celui par défaut. Je souhaite empêcher cela pour ces users.

    En résumé, Si le user crée une table ,ça la crée dans un autre filegroup de manière implicite.
    L'objectif est d'empêcher l'oubli de leur part d'ajouter un 'ON [mon_filegroup]' à chaque création de table, un oubli est vite arrivé.
    Pourquoi? car le filegroup PRIMARY (qui est celui par défaut) n'a pas un gros espace de stockage.

    J'ai cherché sur le net, en vain.

    J'ai trouvé cet article : https://www.brentozar.com/archive/20...ed-management/
    qui semble dire que ce n'est pas faisable.

    Est-ce possible par exemple via un database trigger?

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Il suffit de créer un FILEGROUP bidon "default" et "readonly".

    Du coup quand un utilisateur tente de créer une table dedans (comportement par défaut), ça lui pète au nez

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Par défaut
    J'ai déjà un default filegroup, le "PRIMARY".
    J'ai reçu un nouveau disque spécifique pour mon besoin. Mais je ne veux pas qu'il soit celui par défaut.

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Essaie de suivre la vidéo quand même :

    https://youtu.be/fOnmo9bao-o

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    212
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2009
    Messages : 212
    Par défaut
    Ah je n'avais pas bien compris ta remarque . Oui cela pourrait être une solution effectivement.
    Mais je ne peux l'appliquer car certains processus automatiques existant doivent faire des DROP/CREATE table.
    Si je fais cette modif , je vais avoir un bon retour de manivelle , je devrais adapter tous les codes (rajouter ON[PRIMARY]). Trop compliqué.
    Merci quand même.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Voici un début, car je n'ai pas couvert tous les cas possibles, par exemple :

    • les contraintes de clé primaire et d'unicité qui sont supportées par des index, et pour lesquels on peut spécifier le groupe de fichiers dans lequel on souhaite que les index soient placés
    • les tables optimisées en mémoire (Hekaton)
    • ...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    ALTER TRIGGER TR_IOF_CREATE_TABLE
    	ON DATABASE
    FOR CREATE_TABLE
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	DECLARE @x xml = EVENTDATA()
     
    	DECLARE @sql_recreate_table nvarchar(max)
    		, @sql_drop_table nvarchar(max)
    		, @table_to_drop varchar(1000)
     
    	SELECT	@sql_recreate_table = N.n.value('(./TSQLCommand/CommandText)[1]', 'varchar(max)')
    		, @sql_drop_table = 'DROP TABLE ' + N.n.value('(./SchemaName[1])', 'varchar(128)')
    			+ '.' + N.n.value('(./ObjectName[1])', 'varchar(128)')
    	FROM	@x.nodes('/EVENT_INSTANCE') AS N(n)
     
    	-- Si le dernier caractère n'est pas une parenthèse
    	IF RIGHT(@sql_recreate_table, CHARINDEX(')', REVERSE(@sql_recreate_table)) - 1) = ''
    	BEGIN
    		SET @sql_recreate_table = @sql_recreate_table + ' ON Test'
     
    		BEGIN TRY
    			BEGIN TRANSACTION
    				EXEC (@sql_drop_table)
    				EXEC (@sql_recreate_table)
    			COMMIT TRANSACTION
    		END TRY
    		BEGIN CATCH
    			DECLARE @err_msg nvarchar(4000) = 'Line ' + CAST(ERROR_LINE() AS varchar(10)) + ' - ' + ERROR_MESSAGE()
    				, @err_svt int = ERROR_SEVERITY()
    				, @err_stt int = ERROR_STATE()
     
    			IF XACT_STATE() <> 0
    			BEGIN
    				ROLLBACK TRANSACTION;
    			END
     
    			RAISERROR(@err_msg, @err_svt, @err_stt);
    		END CATCH
    	END
    END
    @++

Discussions similaires

  1. [2008R2] création de table pour des données spécifiques
    Par Kagami dans le forum Développement
    Réponses: 3
    Dernier message: 21/01/2014, 17h16
  2. [AC-2003] création de table sur base sql distante
    Par novice06 dans le forum VBA Access
    Réponses: 3
    Dernier message: 21/06/2010, 11h27
  3. Requête création de table sur base mise en réseau
    Par boss dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 24/01/2007, 15h49
  4. création d'enregistrement sur 2 tables liées
    Par cyrillescot dans le forum Access
    Réponses: 2
    Dernier message: 15/01/2007, 08h22
  5. forcer la création de tables InnoDB sur Free
    Par Eldarion dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 13/10/2005, 22h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo