sql >> Databáze >  >> RDS >> Sqlserver

Msg 4834 Nemáte oprávnění k použití příkazu hromadného načtení

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:

  1. Vytvořte certifikát v master

  2. vytvořit přihlášení z tohoto certifikátu

  3. 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ů

  1. Export certifikátu na disk

  2. Importujte certifikát do vaší uživatelské databáze

nyní můžeme dokončit

  1. vytvořit uživatele z certifikátu
  2. udělit oprávnění k tabulce tomuto uživateli
  3. odstraňte z uložené procedury klauzuli spouštět jako
  4. 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..



  1. Problém s konektorem Confluent zdroje JDBC

  2. MYSQL automaticky vloží soubory csv ze složky pomocí mysqlimport

  3. Atribut zprávy UTL_MAIL volá proceduru OWA_UTIL.cellsprint Oracle

  4. chyba importu s python-mysql-connector 1.16, django 1.6 a python 3.2.3