Jak jsem řekl v komentáři, oprávnění na úrovni serveru jsou odebrána v okamžiku, kdy použijete zosobnění.
Existují 2 způsoby, jak to obejít:
Špatný a rychlý způsob:
Nastavte svou databázi na hodnotu ON. To udělá práci. Ale pokud plně nerozumíte tomu, co to dělá, pak moje rada je NEDĚLAT to.
zde je však kód:
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
Dobrý, ale pomalejší způsob
To je mnohem přesnější a nemá to žádné nepříjemné vedlejší účinky na zabezpečení.
Uděláte to tak, že podepíšete uloženou proceduru certifikátem. Vytvoříte uživatele z tohoto certifikátu v databázi. Tomuto uživateli udělíte správná oprávnění k vaší tabulce v databázi. Můžete také vytvořit přihlášení ze stejného certifikátu a udělit tomuto přihlášení hromadná oprávnění.
Protože uložený proces podepisujete tímto certifikátem, pokaždé, když je sp spuštěn, je spuštěn v kontextu tohoto uživatele a přihlášení, které bylo vytvořeno z tohoto certifikátu.
kroky jsou:
-
Vytvořte certifikát v master
-
vytvořit přihlášení z tohoto certifikátu
-
Udělte hromadná oprávnění správce k tomuto přihlášení
Nyní potřebujete přesně stejný certifikát ve vaší uživatelské databázi, takže musíme udělat několik dalších kroků
-
Export certifikátu na disk
-
Importujte certifikát do vaší uživatelské databáze
nyní můžeme dokončit
- vytvořit uživatele z certifikátu
- udělit oprávnění k tabulce tomuto uživateli
- odstraňte z uložené procedury klauzuli spouštět jako
- Podepište uloženou proceduru pomocí certifikátu
zde je kód:
USE master
go
CREATE CERTIFICATE BulkInsertCert
ENCRYPTION BY PASSWORD = 'NicePassword!0'
WITH SUBJECT = 'Gives Bulk Insert Privilegde'
go
CREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCert
go
GRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogin
go
BACKUP CERTIFICATE BulkInsertCert TO FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk' ,
ENCRYPTION BY PASSWORD = 'EvenNicerPassword!0',
DECRYPTION BY PASSWORD = 'NicePassword!0')
go
USE [YourDatabase]
CREATE CERTIFICATE BulkInsertCert FROM FILE = '[your directory]\BulkInsertCert.cer'
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk',
DECRYPTION BY PASSWORD = 'EvenNicerPassword!0',
ENCRYPTION BY PASSWORD = 'TheVeryBestPasswordThereIs!0')
go
--NOW DELETE THE CERTIFICATES FROM DISK
CREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCert
go
GRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUser
go
ALTER PROCEDURE usp_myproc
AS
EXEC('INSERT INTO ' + @tablename + '
SELECT col1, col2, col3
FROM OPENROWSET(
BULK '''+ @filepath +''',
FORMATFILE='''+ @formatfile +''',
FIRSTROW=2
)as t'
)
-- Sign the test procedure each time you have changed it.
ADD SIGNATURE TO usp_myproc BY CERTIFICATE BulkInsertCert
WITH PASSWORD = 'TheVeryBestPasswordThereIs!0'
go
Poznámka na závěr:
Nahraďte prosím svůj adresář cestou, u které jste si jisti, že servisní účet SQL má oprávnění k zápisu!
Po dokončení nastavení se ujistěte, že jste tyto exportované certifikáty smazali..