Normalt når jeg opretter en lagret procedure, bruger jeg følgende som en skabelon af sort
Create procedure <procedurename> <@param1 <type>, @param2 <type>, etc..> as begin <procedure> end
Er der en måde at inkludere at give eksekveringstilladelse kun til den gemte procedure, mens jeg er ved det?
For eksempel som …
Grant execute [User_Execute]
… men kun for denne lagrede procedure?
Jeg har set nogle andre lignende spørgsmål, men de synes alle at henvise til ALLE de lagrede procedurer og ikke kun en, og jeg har heller ikke set et hvor du kan angive tilladelser inde i create procedure
scriptet. Selv svar om, hvordan jeg kan indstille tilladelser uden GUI til specifikke lagrede procedurer, ville være velkomne.
Rediger Det øverste svar pegede bestemt mig i den rigtige retning. Jeg ledte efter, jeg tænkte ikke på batching af kommandoerne, det er det, jeg endte med at lave, batching kommandoen sammen med min lagrede procedure. Alligevel synes jeg, det er ret glat.
Create procedure <procedurename> <@param1 <type>, @param2 <type>, etc..> as begin <procedure> end GO GRANT EXECUTE ON <procedurename> to <username> GO
Kommentarer
- Koden i den redigerede tekst er gyldig og det rigtige svar på dette spørgsmål.
Svar
GRANT EXECUTE ON dbo.procname TO username;
Svar
trunkerende tabel Indstilling af tilladelse til objekter som lagrede procedurer kan opnås med:
GRANT EXECUTE ON <schema>.<object> to <user>;
Du kan dog også give sikkerhedsrettigheder på både login- og brugerniveau. Du vil bestemme og give KUN de nødvendige rettigheder til de objekter, der kræver adgang (såsom udførelse). Overvej at bruge EXECUTE AS
-funktionen, som muliggør efterligning af en anden bruger til at validere tilladelser, der er nødvendige for at udføre koden UDEN at skulle give alle de nødvendige rettigheder til alle de underliggende objekter (f.eks. tabeller). EXECUTE AS
kan føjes til lagrede procedurer, funktioner, udløsere osv.
Tilføj til koden som følger lige inden for den lagrede procedure:
CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER
I dette tilfælde efterligner du ejeren af det modul, der kaldes til. Du kan også efterligne SELV, ELLER brugeren, der opretter eller ændrer modulet ELLER … imperonate CALLER, som gør det muligt for modulet at overtage tilladelserne til den aktuelle bruger ELLER … efterligne EJER, som vil tage tilladelse fra ejer af proceduren, der kaldes ELLER … efterligne “brugernavn”, som vil efterligne en bestemt bruger ELLER … efterligne “login_navn” med vil efterligne et bestemt login.
MEST af tiden vil du behøver kun at give EXECUTE
rettigheder til lagrede procs, og derefter tildeles rettigheder til alle objekter, der henvises til inden for den lagrede proc.
På denne måde behøver du INGEN give implicitte rettigheder (eksempel: at opdatere data eller ringe til yderligere processer). Ejerforbindelse håndterer dette for dig. Dette er især nyttigt for dynamisk sql, eller hvis du har brug for at oprette forhøjede sikkerhedsopgaver såsom CREATE TABLE
. EXECUTE AS
er et praktisk værktøj at overveje for disse.
Dette eksempel kan hjælpe med at afklare alt dette:
Opret en bruger kaldet NoPrivUser med offentlig adgang til en database (f.eks. dbadb):
USE [master]; GO CREATE LOGIN [NoPrivUser] WITH PASSWORD=N"ABC5%", DEFAULT_DATABASE=[dbadb], CHECK_EXPIRATION=ON, CHECK_POLICY=ON; GO USE [DBAdb]; GO CREATE USER [NoPrivUser] FOR LOGIN [NoPrivUser]; GO
BEMÆRK: SKABER ELLER EJER AF DENNE PROCEDURE KRÆVER OPRET TABELRETTIGHEDER i måldatabasen.
use DBAdb go CREATE PROCEDURE dbo.MyProcedure WITH EXECUTE AS OWNER truncate table MyTable GO GRANT EXEC ON dbo.MyProcedure TO NoPrivUser; GO -- Now log into your database server as NoPrivUser and run the following.
Med EXECUTE AS
-klausulen køres den lagrede procedure under objektsejerens kontekst. Denne kode opretter med succes dbo.MyTable
, og rækker indsættes med succes. I dette eksempel har brugeren NoPrivUser
absolut ingen tildelte rettigheder til at ændre tabellen eller læse eller ændre nogen af dataene i denne tabel.
Det tager kun om de rettigheder, der er nødvendige for at udføre denne specifikke opgave kodet INNEN for denne procedure.
Denne metode til at oprette lagrede procedurer, der kan udføre opgaver, der kræver forhøjede sikkerhedsrettigheder uden permanent at tildele disse rettigheder, kommer til at være meget nyttigt. / p>
Kommentarer
- Dette er det samme svar, som du sendte på SO i går , som Jeg var også nødt til at formatere for læsbarhed.
Svar
vælg databaselogin -> Gå til Sikker og klik på knappen Søg som i det foregående billede. Når du klikker på knappen Søg, finder du følgende vindue for at tilføje typen af objekt.
Klik på knappen Objektyper, og du får vinduet “Vælg objekttyper” med forskellige objekter. Nu, hvis du ser, er den gemte procedure angivet i området for objekttyper. Nu vælger vi vores specifikke lagrede procedure, som vi vil give tilladelse til.
Kommentarer
- For det første var spørgsmålet over fem år, da du besvarede det. Det ville være fint, bortset fra at OP specifikt anmodede om løsninger, der ikke ' ikke bruger GUIen og kan integreres i et script. Dit svar adresserer ikke det.