Det verkar för mig att du inte väntar på en SQL-kod i svaret på din fråga. Huvudaspekten av din fråga är säkerhetsaspekten. Vad ska du göra för att implementera ditt krav utan sysadmin privilegier och utan ett nytt säkerhetshål? Det här är din riktiga fråga tror jag.
Jag ser minst 3 sätt att lösa ditt problem. Men först och främst en kort förklaring varför sysadmin-privilegier finns i alla lösningar baserade på Utökade lagrade procedurer . Utökade lagrade procedurer som xp_cmdshell
är mycket gamla. De fanns åtminstone före SQL Server 4.2, den första Microsoft SQL Server som kördes under det första Windows NT (NT 3.1). I den gamla versionen av SQL Server var jag inte säkerhetsbegränsning för att utföra sådana procedurer, men senare gjorde man sådana begränsningar. Det är viktigt att förstå att alla allmänna ändamål procedurer som gör det möjligt att starta alla processer under SQL Server-konto som xp_cmdshell
och sp_OACreate
måste har sysadmin behörighetsbegränsning. Endast en uppgiftsorienterad procedurer med ett tydligt användningsområde och rollbaserade behörigheter kan lösa problemet utan ett säkerhetshål. Så det här är de 3 lösningssätten som jag lovade tidigare:
- Du skapar ett nytt SQL-konto på din SQL-server med sysadmin privilegier. Sedan skapar du en lagrad procedur som använder några från Utökade lagrade procedurer som
xp_cmdshell
ellersp_OACreate
och implementera dina krav tekniskt (exportera viss information till en CSV-fil). Med hänsyn till EXECUTE AS Klausul (se http://msdn.microsoft.com/en-us/ library/ms188354.aspx ) du konfigurerar den skapade lagrade proceduren så att den körs under kontot med sysadmin privilegier. Du delegerar exekveringen av denna procedur till användare med en viss SQL-roll, för att vara mer flexibel från sidan av delegering av behörighet. - Du kan använda CLR Stored Procedures istället för
xp_cmdshell
ochsp_OACreate
. Du bör också använda rollbaserade behörigheter för den skapade proceduren. - Slutanvändaren anropar inte direkt någon lagrad SQL-procedur vad du skapar. Det finns en mjukvara (som WCF-tjänst eller en webbplats) som anropar din SQL-lagrade procedur. Du kan implementera exporten till CSV-filen i denna programvara och inte i någon lagrad SQL-procedur.
På alla implementeringssätt bör du exakt definiera var du ska hålla lösenordet av kontot som du får åtkomst till filsystemet med. Det finns olika alternativ som du har, alla med motsvarande fördelar och nackdelar. Det är möjligt att använda identitetsstöld för att ge åtkomst till filsystemet med slutanvändarens konto. Det bästa sättet beror på den situation du har i din omgivning.