Je sécurise la base de données en autorisant uniquement l'interaction avec la base de données via une série de Sprocs; tarif assez commun.Autorisations GRANTing entre différentes bases de données (schémas)
J'ai déterré et modifié un script qui boucle et attribue l'autorisation EXECUTE à tous les SProcs non-système. Il fonctionne un régal, sauf que j'aimerais idéalement l'ajouter à la base de données principale afin que je puisse facilement l'utiliser pour tous les projets ultérieurs. Oui, je pourrais enregistrer simple comme un fichier .sql mais je préfère de cette façon.
Le problème est que je ne sais pas comment faire référence dynamiquement aux objets dans un autre DB. Par exemple, je peux facilement interroger sur MyDB.dbo.INFORMATION_SCHEMA.ROUTINES, mais si le nom de la base de données est dynamique (par exemple @MyDBName), comment puis-je interroger les objets de cette base de données?
Edit: Merci aux affiches ci-dessous, j'ai maintenant une solution de travail:
USE [master]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spGrantExec]
@User sysname,
@DB varchar(50),
@Target varchar(50)
AS
/*---------------------------- SQL 2005 + -------------------------------*/
SET NOCOUNT ON
-- 1 - Variable declarations
DECLARE @SQL varchar(8000)
-- 2 - Create temporary table
Set @SQL =
'USE @DB
DECLARE @MAXOID int
DECLARE @OwnerName varchar(128)
DECLARE @ObjectName varchar(128)
DECLARE @CMD1 varchar(8000)
CREATE TABLE #StoredProcedures
(OID int IDENTITY (1,1),
StoredProcOwner varchar(128) NOT NULL,
StoredProcName varchar(128) NOT NULL)
-- 3 - Populate temporary table
INSERT INTO #StoredProcedures (StoredProcOwner, StoredProcName)
SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME LIKE ''' + @Target + '%''
AND ROUTINE_TYPE = ''PROCEDURE''
-- 4 - Capture the @MAXOID value
SELECT @MAXOID = MAX(OID) FROM #StoredProcedures
-- 5 - WHILE loop
WHILE @MAXOID > 0
BEGIN
-- 6 - Initialize the variables
SELECT @OwnerName = StoredProcOwner,
@ObjectName = StoredProcName
FROM #StoredProcedures
WHERE OID = @MAXOID
-- 7 - Build the string
SELECT @CMD1 = ''GRANT EXEC ON '' + ''['' + @OwnerName + '']'' + ''.'' + ''['' + @ObjectName + '']'' + '' TO @user''
-- 8 - Execute the string
Print @CMD1
EXEC(@CMD1)
-- 9 - Decrement @MAXOID
SET @MAXOID = @MAXOID - 1
END
-- 10 - Drop the temporary table
DROP TABLE #StoredProcedures'
Set @SQL = REPLACE(REPLACE(REPLACE(@SQL, '@DB', @DB), '@User', @User), '@Target', @Target)
--Select @SQL
--Print @SQL
Exec (@SQL)
SET NOCOUNT OFF
Vous pouvez regarder le plus propre que j'ai trouvé: SELECT @sp_executesql = QUOTENAME (@dbname) + '..sp_executesql' EXEC @sp_executesql @ CMD1 –