L'outil (osql et sqlcmd) de SQL Server permet d'exécuté des tâches à partir de la ligne de commande.
Voici une différence que je trouve très importante et qui m'a manqué dans la version antérieur. Le passage de paramètre à un fichier.sql, on devait lui passer directement sur la ligne de commande ce qui était pénible.
EX:
1- Fichier.sql :
SET NOCOUNT ON
Select $(Cols) from $(tablename)
GO
2-C:\>sqlcmd -i "c:\Fichier.sql" -o "c:\output.txt" -v cols="name,object_id,create_date" tablename="sys.objects"
Thursday, November 20, 2008
Thursday, November 13, 2008
Sécurisé nos tables
Il y a plusieurs façon de sécurisé nos tables comme par exemple; donner des droits de lecture uniquement à un certain groupe d'utilisateur.
Cependant pour les utilisateurs qui ont le droit d'administrateur, une façon très sécuritaire est de faire des View avec option SCHEMABINDING.
Cette pratique est de créer des View pour chaque tables de notre base de donnée avec l'option SHEMABINDING, cela ne permet pas de supprimer par erreur une table, car si on essaye de supprimer la table, on recevra une erreur de dépendance.
Ces View ne seront pas utilisé par les applications et les utilisateurs.
Cependant pour les utilisateurs qui ont le droit d'administrateur, une façon très sécuritaire est de faire des View avec option SCHEMABINDING.
Cette pratique est de créer des View pour chaque tables de notre base de donnée avec l'option SHEMABINDING, cela ne permet pas de supprimer par erreur une table, car si on essaye de supprimer la table, on recevra une erreur de dépendance.
Ces View ne seront pas utilisé par les applications et les utilisateurs.
Thursday, October 30, 2008
Instance 2000 et 2005 sur le même serveur
Les deux instances peuvent cohabiter sur le même serveur. La procédure à suivre est d'installer en premier lieux le serveur SQL2000 et ensuite le serveur SQL2005.
Cependant le contraire ce peut également, mais à une condition qu'on exécute le script inscat.sql du service Pack4 de SQL2000 après l'installation de celui-ci.
N.B On peut gérer un serveur SQL2000 à partir de Studio Management 2005, mais on ne peut pas gérer un serveur SQL2005 à partir d'un serveur SQL2000.
Cependant le contraire ce peut également, mais à une condition qu'on exécute le script inscat.sql du service Pack4 de SQL2000 après l'installation de celui-ci.
N.B On peut gérer un serveur SQL2000 à partir de Studio Management 2005, mais on ne peut pas gérer un serveur SQL2005 à partir d'un serveur SQL2000.
Wednesday, October 29, 2008
Ne peut pas lire le log d'erreurs car TempDB n'a plus d'espace
La Base de données TempDB contient toutes sortes de tables qui sont temporaire. La plupart des applications se servent de celles-ci, mais pas uniquement elles, mais bien SQL Server lui même.
Il arrive parfois que nous ne pouvons pas lire le log erreurs dans SQL parce qu'il y a un problème d'espace dans la Base de données TempDB.
Voici la commande à faire pour pouvoir voir le log d'erreur de SQL Server sans aller Management Studio (Entreprise Manager).
exec ('master..xp_readerrorlog')
Ou pour voir les autres fichiers de log d'erreurs
( @a = numéro de fichier ex: 1,2,3)
Declare @a Int
exec ('master..xp_readerrorlog ' + @a)
Ensuite vous pouvez voir ce qui se passe avec TempDB....
Il arrive parfois que nous ne pouvons pas lire le log erreurs dans SQL parce qu'il y a un problème d'espace dans la Base de données TempDB.
Voici la commande à faire pour pouvoir voir le log d'erreur de SQL Server sans aller Management Studio (Entreprise Manager).
exec ('master..xp_readerrorlog')
Ou pour voir les autres fichiers de log d'erreurs
( @a = numéro de fichier ex: 1,2,3)
Declare @a Int
exec ('master..xp_readerrorlog ' + @a)
Ensuite vous pouvez voir ce qui se passe avec TempDB....
Monday, October 20, 2008
Indexes non utilisés (SQL2005)
Lorsque vous avez des problèmes de performances, une des options que vous avez et de savoir quels sont les indexes qui ne sont pas utilisé par vos requêtes.
script pour SQL 2005 :
GO
IF EXISTS (SELECT name FROM dbo.sysobjects WHERE id = Object_id(N'[dbo].[usp_Indexesunused]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[usp_IndexesUnused]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROC usp_IndexesUnused @DBName VARCHAR(255) = NULL
AS
-- EXEC usp_IndexesUnused
SET NOCOUNT ON
IF @DBName IS NULL
BEGIN
SELECT 'DB name is authorative.' AS 'WARNING - SYNTAX ERROR!'
RETURN
END
DECLARE @DBID int
SELECT @DBID = DB_ID(@DBName)
DECLARE @SQLcmd NVARCHAR(max)
SET @SQLcmd = 'USE [' + @DBName + '];
SELECT ''[' + @DBName + ']'' AS DBName,
OBJECT_NAME(a.object_id) AS ''Table'',
c.name AS ''IndexName'',
(SELECT used/128 FROM sysindexes b WHERE b.id = a.object_id AND b.name=c.name AND c.index_id = b.indid) AS ''Size_MB'',
(a.user_seeks + a.user_scans + a.user_lookups) AS ''Hits'',
RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN (a.user_seeks + a.user_scans + a.user_lookups) = 0 THEN 0 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups)) * 100 /
CASE (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates)) END END AS DECIMAL(18,2)))) + ''/'' +
RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN a.user_updates = 0 THEN 0 ELSE CONVERT(REAL, a.user_updates) * 100 /
CASE (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates)) END END AS DECIMAL(18,2)))) AS [R/W_Ratio],
a.user_updates AS ''Updates'',
--indicates the level of maintenance on the index caused by insert, --- update, or
--delete operations on the underlying table or view
a.last_user_update AS ''Update_Date''
FROM sys.dm_db_index_usage_stats a
JOIN sysobjects AS o ON (a.OBJECT_ID = o.id)
JOIN sys.indexes AS c ON (a.OBJECT_ID = c.OBJECT_ID AND a.index_id = c.index_id)
WHERE o.type = ''U'' -- exclude system tables
AND c.is_unique = 0 -- no unique indexes
AND c.type = 2 -- nonclustered indexes only
AND c.is_primary_key = 0 -- no primary keys
AND c.is_unique_constraint = 0 -- no unique constraints
AND c.is_disabled = 0 -- only active indexes
AND a.database_id = ' + CAST(@DBID AS CHAR(4)) + ' -- for current database only
AND ((a.user_seeks + a.user_scans + a.user_lookups) = 0 OR a.user_updates = 0)
ORDER BY OBJECT_NAME(a.object_id), a.user_updates'
EXEC master..sp_executesql @SQLcmd
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
script pour SQL 2005 :
GO
IF EXISTS (SELECT name FROM dbo.sysobjects WHERE id = Object_id(N'[dbo].[usp_Indexesunused]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
DROP PROCEDURE [dbo].[usp_IndexesUnused]
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROC usp_IndexesUnused @DBName VARCHAR(255) = NULL
AS
-- EXEC usp_IndexesUnused
SET NOCOUNT ON
IF @DBName IS NULL
BEGIN
SELECT 'DB name is authorative.' AS 'WARNING - SYNTAX ERROR!'
RETURN
END
DECLARE @DBID int
SELECT @DBID = DB_ID(@DBName)
DECLARE @SQLcmd NVARCHAR(max)
SET @SQLcmd = 'USE [' + @DBName + '];
SELECT ''[' + @DBName + ']'' AS DBName,
OBJECT_NAME(a.object_id) AS ''Table'',
c.name AS ''IndexName'',
(SELECT used/128 FROM sysindexes b WHERE b.id = a.object_id AND b.name=c.name AND c.index_id = b.indid) AS ''Size_MB'',
(a.user_seeks + a.user_scans + a.user_lookups) AS ''Hits'',
RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN (a.user_seeks + a.user_scans + a.user_lookups) = 0 THEN 0 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups)) * 100 /
CASE (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates)) END END AS DECIMAL(18,2)))) + ''/'' +
RTRIM(CONVERT(NVARCHAR(10),CAST(CASE WHEN a.user_updates = 0 THEN 0 ELSE CONVERT(REAL, a.user_updates) * 100 /
CASE (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates) WHEN 0 THEN 1 ELSE CONVERT(REAL, (a.user_seeks + a.user_scans + a.user_lookups + a.user_updates)) END END AS DECIMAL(18,2)))) AS [R/W_Ratio],
a.user_updates AS ''Updates'',
--indicates the level of maintenance on the index caused by insert, --- update, or
--delete operations on the underlying table or view
a.last_user_update AS ''Update_Date''
FROM sys.dm_db_index_usage_stats a
JOIN sysobjects AS o ON (a.OBJECT_ID = o.id)
JOIN sys.indexes AS c ON (a.OBJECT_ID = c.OBJECT_ID AND a.index_id = c.index_id)
WHERE o.type = ''U'' -- exclude system tables
AND c.is_unique = 0 -- no unique indexes
AND c.type = 2 -- nonclustered indexes only
AND c.is_primary_key = 0 -- no primary keys
AND c.is_unique_constraint = 0 -- no unique constraints
AND c.is_disabled = 0 -- only active indexes
AND a.database_id = ' + CAST(@DBID AS CHAR(4)) + ' -- for current database only
AND ((a.user_seeks + a.user_scans + a.user_lookups) = 0 OR a.user_updates = 0)
ORDER BY OBJECT_NAME(a.object_id), a.user_updates'
EXEC master..sp_executesql @SQLcmd
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Wednesday, October 15, 2008
Opti Manage Data
Salut à tous,
Voici mon blog Opti Manage Data, ce Blog servira de transfert de connaissance de SQL Server et de service Conseil.
Dans notre domaine de l'informatique, il y a plusieurs technologies et il est très difficile de toutes les suivre. Pour cette raison, je vais inclure des articles sur SQL et répondre à toutes vos questions (jrmep@hotmail.com) dans un délai respectable.
Les gens qui me connaissent savent très bien que je suis une personne qui aime apprendre et surtout partager mon savoir.
Voici mon blog Opti Manage Data, ce Blog servira de transfert de connaissance de SQL Server et de service Conseil.
Dans notre domaine de l'informatique, il y a plusieurs technologies et il est très difficile de toutes les suivre. Pour cette raison, je vais inclure des articles sur SQL et répondre à toutes vos questions (jrmep@hotmail.com) dans un délai respectable.
Les gens qui me connaissent savent très bien que je suis une personne qui aime apprendre et surtout partager mon savoir.
Manuel E. Pineda
(DBA SQL Server)
Subscribe to:
Posts (Atom)