Table des matières
Affiche une liste de connexions par hostname et par base de données
SELECT CASE WHEN GROUPING(hostname) = 1 THEN 'TOTAL' ELSE hostname END AS Host, db_name(dbid), COUNT(*) AS cnt FROM master.dbo.sysprocesses GROUP BY hostname, dbid WITH ROLLUP HAVING GROUPING(dbid) = 0 OR GROUPING(hostname) = 1 ORDER BY CASE WHEN GROUPING(hostname) = 1 THEN 1 ELSE 0 END, hostname , dbid
supprime toutes les vues de réplication
DECLARE @name sysname SELECT @name = '' WHILE @name < (SELECT MAX(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_NAME LIKE 'syncobj_%') BEGIN SELECT @name = MIN(TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_NAME LIKE 'syncobj_%' AND TABLE_NAME > @name EXEC('drop view ' + @name) END
Ajoute des users dans une base à partir des logins du serveur
USE dabaseName GO DECLARE cur CURSOR FAST_FORWARD FOR SELECT l.name FROM master.dbo.sysxlogins l LEFT JOIN sysusers u ON u.sid = l.sid WHERE u.sid IS NULL AND l.name IS NOT NULL AND l.sid IS NOT NULL ORDER BY l.name DECLARE @name sysname OPEN cur FETCH NEXT FROM cur INTO @name WHILE (@@fetch_status <> -1) BEGIN IF (@@fetch_status <> -2) BEGIN EXEC sp_grantdbaccess @name END FETCH NEXT FROM cur INTO @name END CLOSE cur DEALLOCATE cur GO
Ajoute les users dans un role
Crée juste les appels de sp à lancer
USE DATABASE GO DECLARE @RoleName sysname SET @RoleName = 'role_name' CREATE TABLE #temp (role_col nvarchar(132) NOT NULL, member nvarchar(132) NOT NULL, id_col nvarchar(176)) INSERT INTO #temp (role_col, member, id_col) exec sp_helprolemember @RoleName SELECT 'exec sp_addrolemember N''' + @RoleName + ''', N''' + s.name + '''' FROM dbo.sysusers s LEFT JOIN #temp t ON s.name = t.member WHERE s.STATUS = 2 AND t.member IS NULL AND s.name NOT IN ('guest', 'dbo') DROP TABLE #temp
lance du code dans toutes les bases
l'exemple suivant mets toutes les bases en lecture seule.
SELECT 'ALTER DATABASE ' + name + ' SET READ_ONLY' + char(10) + 'GO' + char(10) FROM master.dbo.sysdatabases WHERE dbid > 4 ORDER BY Name
vide et nettoie une base
Un exemple de code qui génère des instructions pour vider une base. Supprime d'abord les contraintes de DRI, truncate les tables, shrink la base
-- CLEAN AND EMPTY DATABASE /* SELECT t.name as tbl, c.name as fkey FROM sysforeignkeys fk JOIN sysobjects c ON fk.constid = c.id JOIN sysobjects t ON fk.fkeyid = t.id */ SELECT 'ALTER TABLE ' + t.name + ' DROP CONSTRAINT ' + c.name FROM sysforeignkeys fk JOIN sysobjects c ON fk.constid = c.id JOIN sysobjects t ON fk.fkeyid = t.id SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' DBCC SHRINKDATABASE ('dbname') DBCC SHRINKFILE (dbname_Log, 10)
copie les catégories des jobs de l'agent
Génère des instructions pour insérer, sur un autre serveur, des catégories de jobs personnalisées.
SELECT 'EXEC msdb.dbo.sp_add_category ''JOB'', ''LOCAL'', ''' + name + '''' FROM msdb.dbo.syscategories WHERE category_Id > 99 ORDER BY category_Id
Explorer les disques physiques
… quand vous avez un accès sysadmin.
CREATE TABLE #tmp (Drive char(1), MBFree int) DECLARE @Drive char(1) DECLARE @sql varchar(100) INSERT INTO #tmp EXEC master.dbo.xp_fixeddrives WHILE EXISTS (SELECT 1 FROM #tmp) BEGIN SELECT TOP 1 @Drive = Drive FROM #tmp SET @sql = @Drive + ':\' SELECT 'Content of drive ' + @sql EXEC master.dbo.xp_dirtree @sql DELETE FROM #tmp WHERE Drive = @Drive END DROP TABLE #tmp
recherche d'un user
liste les bases et roles dans lequel un user est présent
DECLARE @user AS sysname, @sql AS varchar(1000) CREATE TABLE ##roles (DBName sysname NULL, RoleName sysname NULL, UserName sysname NULL) SET @user = '%myname%' SET @sql = 'INSERT INTO ##roles SELECT ''?'' as DBName, r.name as RoleName, u.name as UserName FROM ?.dbo.sysusers u LEFT JOIN (?.dbo.sysmembers m JOIN ?.dbo.sysusers r ON m.groupuid = r.uid AND r.issqlrole = 1) ON u.uid = m.memberuid WHERE (u.name LIKE ''' + @user + ''' OR r.name LIKE '''+ @user + ''')' EXEC sp_MSforeachdb @sql SELECT * FROM ##roles ORDER BY DBName, RoleName, UserName DROP TABLE ##roles
liste les privilèges d'un user
Liste les privilèges accordés à un user sur tous les objets de toutes les bases
DECLARE @user AS sysname, @sql AS varchar(1000) CREATE TABLE ##roles (DBName sysname NULL, UserName sysname NULL, ObjectType char(3) NULL, ObjectNameName sysname NULL, Action varchar(30) NULL, ProtectType varchar(10) NULL) SET @user = '%myname%' SET @sql = ' INSERT INTO ##roles SELECT ''?'' as DBName, u.name as UserName, o.type, o.name as ObjectName, CASE p.action WHEN 26 THEN ''REFERENCES'' WHEN 178 THEN ''CREATE FUNCTION'' WHEN 193 THEN ''SELECT'' WHEN 195 THEN ''INSERT'' WHEN 196 THEN ''DELETE'' WHEN 197 THEN ''UPDATE'' WHEN 198 THEN ''CREATE TABLE'' WHEN 203 THEN ''CREATE DATABASE'' WHEN 207 THEN ''CREATE VIEW'' WHEN 222 THEN ''CREATE PROCEDURE'' WHEN 224 THEN ''EXECUTE'' WHEN 228 THEN ''BACKUP DATABASE'' WHEN 233 THEN ''CREATE DEFAULT'' WHEN 235 THEN ''BACKUP LOG'' WHEN 236 THEN ''CREATE RULE'' END as Action, CASE p.protecttype WHEN 204 THEN ''GRANT_W_GRANT'' WHEN 205 THEN ''GRANT'' WHEN 206 THEN ''REVOKE'' END as ProtectType FROM ?.dbo.sysusers u JOIN ?.dbo.sysprotects p ON u.uid = p.uid JOIN ?.dbo.sysobjects o ON p.id = o.id WHERE u.name LIKE ''' + @user + '''' EXEC sp_MSforeachdb @sql SELECT * FROM ##roles ORDER BY 1, 2, 3 DROP TABLE ##roles
trouver la taille d'un index
SELECT name, cast(used*8 AS varchar(15)) + ' ko' AS [space used], rowcnt AS [Rows] FROM dbo.sysindexes WHERE name = 'indexname' /* pour un index spécifique */ ORDER BY name /* pour tous les indexes */
lister les colonnes IDENTITY
SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'dbo' AND COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 ORDER BY TABLE_NAME
trouver des vues indexées
SELECT * FROM sysindexes WHERE id=object_id('view_name')
Lancer un backup de toutes les bases
EXEC sp_MSforeachdb 'IF DATABASEPROPERTYEX(''?'', ''status'') = ''ONLINE'' AND ''?'' NOT IN(''master'', ''model'',''tempdb'',''msdb'') BACKUP DATABASE ?'
Lister les clés étrangères d'une base
Ecrite par Dan Guzman, MVP. Trouvée sur usenet et copiée ici pour référence.
SELECT pk.TABLE_SCHEMA AS PK_TableSchema, pk.TABLE_NAME AS PK_TableName, pk_col.COLUMN_NAME AS PK_ColumnName, fk.CONSTRAINT_NAME AS FK_ConstraintName, fk.TABLE_SCHEMA AS FK_TableSchema, fk.TABLE_NAME AS FK_TableName, fk_col.COLUMN_NAME AS FK_ColumnName, pk_col.ORDINAL_POSITION AS OrdinalPosition FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pk_col ON pk_col.CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND pk_col.CONSTRAINT_NAME = pk.CONSTRAINT_NAME JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc ON rc.UNIQUE_CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND rc.UNIQUE_CONSTRAINT_NAME = pk.CONSTRAINT_NAME JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk ON fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fk_col ON fk_col.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND fk_col.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND fk_col.ORDINAL_POSITION = pk_col.ORDINAL_POSITION WHERE pk.CONSTRAINT_TYPE = 'PRIMARY KEY' AND fk.CONSTRAINT_TYPE = 'FOREIGN KEY' ORDER BY pk.TABLE_SCHEMA, pk.TABLE_NAME, fk.CONSTRAINT_NAME, fk.TABLE_SCHEMA, fk.TABLE_NAME, pk_col.ORDINAL_POSITION
Lister les clés primaires d'une base
Avec, en prime, l'indication du Identity
SELECT c.TABLE_NAME, k.COLUMN_NAME, COLUMNPROPERTY(OBJECT_ID(c.TABLE_NAME), k.COLUMN_NAME, 'IsIdentity') AS IS_IDENTITY FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS c JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON c.CONSTRAINT_NAME = k.CONSTRAINT_NAME WHERE c.CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY c.TABLE_NAME, k.COLUMN_NAME
Identifier les bases non sauvegardées
Bases de données du serveur sur lesquelles il n'y a pas de backup
SELECT db.CATALOG_NAME FROM INFORMATION_SCHEMA.SCHEMATA db LEFT JOIN msdb.dbo.backupset bs ON bs.database_name = db.CATALOG_NAME WHERE bs.database_name IS NULL ORDER BY db.CATALOG_NAME
sql_server/snippets/administration/index.txt · Dernière modification: 2007/09/27 18:14 (édition externe)



