|
无论我如何尝试,我都会收到此错误。8 q, J5 I0 E) t/ H7 j# b. x) ^
我有一个存储的proc,execute为:
# V, K( x% S' F: JCREATE PROCEDURE usp_myproc; w! q- w7 _: s/ y+ L( y* B% _
WITH EXECUTE AS 'myuser'
" J( \7 v& |: G$ z& S* r) [在这个sp我有
: d/ p8 V( L1 oEXEC('INSERT INTO ' + @tablename + '
" ~6 p. }: G+ |# c* A0 i' h) O o SELECT col1, col2, col3
$ U4 L& V7 n0 r6 M FROM OPENROWSET(
' O1 x- m! n& _3 o& v. s9 r; s BULK '''+ @filepath +''',$ M# W7 }1 h4 x+ E: N# x6 ]6 i7 {
FORMATFILE='''+ @formatfile +''',
" ]' H/ i- g2 z4 A( w* A* k; M FIRSTROW=2
# f/ ] T Q- \$ i9 h1 i3 l )as t'- |( C- I) s9 p
)" l2 X7 U% a1 H/ T
将myuser确实有bulkadmin角色,读/写,创建表,插入,选择,执行,修改权限。其中一些可能不是必需的,但这是我到目前为止已经尝试过的方法。我想念什么?
7 t; w/ W9 s$ F谢谢你。
9 [( V9 ~7 Q' n5 [3 @' P
: J$ r! a7 [9 j4 o- R1 ~& w解决方案:, t' V/ ?; m* Y7 D& V4 F+ a
5 \9 K" i2 }$ j. u& x1 o
. R6 ~8 a, K% B+ {: d" b
& J$ c2 i; v) |' [; G" d0 r+ A 正如我在评论中所说,使用模拟时,服务器级别的权限会被剥夺。
7 T0 M' W# R; Z* y R9 F( ^& J有两种解决方法:( B) m4 f* k5 z5 f4 m' `$ v" w
坏而又快的方法:( P8 ]9 `7 B* A0 Q& Q1 l- n
将您的数据库设置为“开”。它将完成工作。但是,如果您不完全了解它的功能,那么我的建议是不要这样做。
; h: Z M7 M; U但是,这是代码:2 `9 [& `+ b/ a! Q
ALTER DATABASE [YourDatabase] SET TRUSTWORTHY ON;
' O( B: B1 H! y. d好的但较慢的方法( D9 ?; N1 {3 v% ~
这更加精确,并且没有任何讨厌的安全副作用。
/ j8 y! v% d) X5 J8 i- s您要做的是使用证书对存储过程进行签名。您可以在数据库中使用该证书创建用户。您向该用户授予对数据库中表的适当权限。您还可以从同一证书创建“登录名”,然后授予该登录名大量权限。% q3 i2 \4 U' g4 ~2 K
因为您使用该证书对存储的proc进行签名,所以每次执行sp时,都会在该用户的上下文中执行该sp,并登录从该证书创建的位置。
( s( [ K% p$ t+ l步骤是:
2 } O4 n4 ?$ q! I[ol]
2 V# C; r- n# [& B) A# W在母版中创建证书
8 Z* K) |& |8 a- k& T' Z- E R% G' ?) |9 Z6 e& I' h
从该证书创建登录名
, m$ G! E& A- L: q5 {5 `% C1 ?1 I# ]
7 o i8 y+ c: t/ _( X, A向该登录名授予批量管理员权限9 Z# a9 X( Y) p1 ^' R
4 h4 i; ]9 o( z% P
[/ol]
$ i& F7 J, k" B7 n# h* }现在,您需要在用户数据库中使用完全相同的证书,因此我们需要执行一些额外的步骤1 w2 W( S; a0 }. P+ Q: L$ `
[ol]3 ]) @7 X1 C3 p2 K2 L. `
将证书导出到磁盘
3 H/ B: J2 w+ ?
, \$ m% [0 v% H. Y' b& |1 ]% |将证书导入您的用户数据库
* B/ g* p- D- {3 ]. v) s2 L
, v& ?6 ~9 Y* h( h* J[/ol]- _, ^- s; a1 O, c" b0 J) n3 h4 g) v
现在我们可以完成
, U: z' h6 q: O, j- k[ol]从证书创建用户
0 C3 c5 D7 x7 {向该用户授予表权限0 Z# p# j( C1 A# f
从存储过程中删除execute as子句
: B' X2 I1 U1 f" l" z, Z) `使用证书签署存储过程
5 q1 i$ d9 G' P6 }[/ol]
0 ?5 R9 a6 ?& ~! O这是代码:
6 c6 L' m- @2 | G# ] v+ N# Q' AUSE master
4 N- \5 g6 ]1 S) |- U: m+ e! Sgo
8 b0 v! X, Z0 I4 u K. JCREATE CERTIFICATE BulkInsertCert& Q" D& V; `; |! U0 E( L9 H
ENCRYPTION BY PASSWORD = 'NicePassword!0'& X4 k4 b( _3 F* h9 _2 t o: S
WITH SUBJECT = 'Gives Bulk Insert Privilegde'! l3 g$ P% @8 {* T( i& Z
go
/ m! a2 I" X. ACREATE LOGIN BulkInsert_CertLogin FROM CERTIFICATE BulkInsertCert" x) m8 n) l" ^. X8 |
go7 ^! q7 s4 q) X9 V
- f& K7 T" X/ _4 _
GRANT ADMINISTER BULK OPERATIONS TO BulkInsert_CertLogin
9 n$ P+ R9 A) S! tgo N% W. k, r5 V" W, Z7 g+ i
7 J& R8 m' U" z/ X) m, J% E! PBACKUP CERTIFICATE BulkInsertCert TO FILE = '[your directory]\BulkInsertCert.cer'
4 O: @2 d) J% Q9 ]) D# p3 @& KWITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk' ,1 H" F- F! w! O- I
ENCRYPTION BY PASSWORD = 'EvenNicerPassword!0',
- z; v! F3 t5 I9 \7 ` DECRYPTION BY PASSWORD = 'NicePassword!0'), g% x+ G- p! `! F7 h0 j7 e2 f8 b
go
2 a5 {7 K4 [* d' T) uUSE [YourDatabase] a6 E1 c8 p6 c j4 p
CREATE CERTIFICATE BulkInsertCert FROM FILE = '[your directory]\BulkInsertCert.cer'* }( k" h* `! \9 x2 C
WITH PRIVATE KEY (FILE = '[your directory]\BulkInsertCert.pvk',
5 N9 Y$ u7 P9 F( C+ R1 g DECRYPTION BY PASSWORD = 'EvenNicerPassword!0',$ e7 v# M% v+ `! a8 T) c
ENCRYPTION BY PASSWORD = 'TheVeryBestPasswordThereIs!0')! v% c% _" r7 M( w, L Q
go7 _* K* A$ I( H! |7 Y
--NOW DELETE THE CERTIFICATES FROM DISK5 {! s# V- E. n, R. Q# _5 A& Y
CREATE USER BulkInsert_CertUser FOR CERTIFICATE BulkInsertCert/ s1 h; d" h' W
go4 L, P1 f/ y9 I$ W. \4 t" v
GRANT ALTER, INSERT ON [YourTable] TO BulkInsert_CertUser- r- q$ `, l0 Q1 _
go* q1 W: c8 s3 X B# W. X5 H- z
% i4 n, d# g* F: {( @
ALTER PROCEDURE usp_myproc/ g0 S" s: u$ O2 G
AS
3 f7 N8 X% \/ H' p, SEXEC('INSERT INTO ' + @tablename + '
- j- ^* o- y! k9 ~ SELECT col1, col2, col3
: R/ q/ m$ G* z, `/ U4 _ FROM OPENROWSET( 3 \) K$ U8 o6 z. j7 X
BULK '''+ @filepath +''',$ M" V4 k7 q+ I7 d: G2 [
FORMATFILE='''+ @formatfile +''',
/ g b& }5 m3 g1 ]1 n FIRSTROW=2& G' D" R) h4 D+ b# b" q! ]
)as t'
n, T$ `2 c# O" v' G* B- y" { )5 I6 U1 I2 }& @6 | y4 p
-- Sign the test procedure each time you have changed it.
* a- C0 A7 Z3 m: Q" Y3 P+ CADD SIGNATURE TO usp_myproc BY CERTIFICATE BulkInsertCert) _( k9 M; Y4 |% t5 N
WITH PASSWORD = 'TheVeryBestPasswordThereIs!0'$ {: U" u" P/ B
go1 E" p( X( h. c% c( b
最后说明:+ {/ v2 v* w6 u7 e' D5 `9 t
请用您确定sql服务帐户具有写权限的路径替换您的目录!1 V* G2 k' w6 \) t# l, B
完成设置后,请确保删除那些导出的证书。 |
|