Ich versuche, SQL Server-Benutzer über LinkdedServers zu aggregieren, kann aber den Datenbanknamen in meiner Abfrage nicht auswählen. Ich versuchte, db_name() as ''Database''
In meiner Select-Anweisung zu verwenden, aber es verwendet den aktuellen Datenbankkontext und nicht die Datenbank, aus der ich auswähle. Ich stelle fest, dass dies geschieht, weil ich den "vollqualifizierten" Datenbanknamen verwende, so dass sich der Datenbankkontext niemals wirklich ändert. Ich bin auch nicht in der Lage, den Cursor-Wert als Teil meiner Select-Anweisung zu ziehen.Verwendung von Cursor-Wert in SELECT-Anweisung in Dynamic SQL (SQL Server)
Hat jemand irgendwelche Ideen, wie ich den Datenbanknamen der Datenbank bekommen kann, die ich auswähle?
Hier ist mein Code:
DECLARE @DatabaseName VARCHAR(30)
DECLARE c1 CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR
SELECT
Name
FROM
[LinkedServer].master.sys.databases
WHERE
Name NOT IN (
'master',
'model',
'tempdb',
'msdb',
'distribution',
)
OPEN c1
FETCH NEXT FROM c1
INTO @DatabaseName
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC (
'
--INSERT INTO [Gather_Privileged_DBUsers_Sox]
SELECT distinct (dp.name) as ''DatabaseUser'',
s.name as ''ServerName'',
db_name() as ''Database'',
getdate() as ''date''
FROM [LinkedServer].[' + @DatabaseName + '].sys.database_role_members drm
JOIN [LinkedServer].[' + @DatabaseName + '].sys.database_principals dp
ON drm.member_principal_id = dp.principal_id
JOIN [LinkedServer].[' + @DatabaseName + '].sys.database_principals dp2
ON drm.role_principal_id = dp2.principal_id
JOIN [LinkedServer].[master].[sys].[servers] s on 1=1
WHERE
dp2.name in
(''db_owner'',''db_accessadmin'',''db_securityadmin'',''db_ddladmin'')
AND s.server_id = 0
AND dp.name not in (''dbo'')
AND dp.type != ''R''
')
FETCH NEXT FROM c1
INTO @DatabaseName
END
CLOSE c1;
DEALLOCATE c1;
GO
Versuch, den Variablenwert zu verwenden:
SELECT distinct (dp.name) as ''DatabaseUser'',
s.name as ''ServerName'',
' + @DatabaseName + ' as ''Database'',
getdate() as ''date''
Wenn ich das tue, erhalte ich folgende Fehlermeldung: Msg 207, Level 16, State 1, Line 5 Invalid column name 'myTestDatabase'.
Wie kann ich mich wenden die Variable in einer Zeichenfolge in dieser Situation?
Sie haben den Datenbanknamen genau dort ... in der Variablen. Statt DB_NAME Verwendung '+ @DatabaseName +' als Datenbank –
distinct (dp.name) SELECT als '' Database '', \t \t s.name als '' Servername '', \t \t '+ @DatabaseName +' als '' Datenbank '', \t \t getdate() als '' Datum '' Meine Syntax möglicherweise falsch, aber wenn ich das versuchte, erhalte ich die folgende Fehlermeldung: Msg 207, Ebene 16, Status 1, Zeile 5 Ungültiger Spaltenname 'mytestDatabase'. – user3220707
Sie müssen es zu einer Zeichenfolge machen. Wahrscheinlich muss nur zu jeder Seite im String literal. Können Sie Ihren Code in der Frage veröffentlichen? Formatierung in den Kommentaren ist schrecklich. –