Tránh lỗi khóa lược đồ độc quyền với ArcPy?


11

Tôi có một kịch bản để cập nhật một số tính năng trên cơ sở dữ liệu của mình mỗi đêm (chỉ để sao chép và thay thế một số tính năng). Tính năng này là "chỉ đọc". Vấn đề của tôi là tôi không thể tránh khỏi việc các tính năng này được mở bởi người dùng và tập lệnh của tôi có thể hiển thị lỗi sau:

ExecuteError: ERROR 000464: Cannot get exclusive schema lock. 
              Either being edited or in use by another application.

Tôi có thể buộc tập lệnh phyton, thông qua một số lệnh, sao chép các tệp, thậm chí được mở bởi một số người dùng không? Tôi có thể gỡ bỏ tất cả các kết nối trên cơ sở dữ liệu của mình trước khi chạy tập lệnh không?


1
Điều này dường như là một lỗi arcpy / arcgisscripting. Vui lòng xác nhận bạn đang sử dụng và cơ sở dữ liệu nào bạn đang sử dụng.
blah238

Câu trả lời:


5

Tôi cho rằng bạn đang làm việc với SDE.

Bạn nên hủy tất cả các kết nối bằng sdemoncông cụ dòng lệnh.

  1. Nếu có ArcSDE được cài đặt trên PC nơi bạn đang chạy tập lệnh thì bạn có thể thực thi sdemon -o killcục bộ để hủy tất cả các kết nối. Hãy xem chủ đề trợ giúp này . Tôi không chắc chắn là nó giết chết các kết nối trực tiếp trên 10.0. Tôi nhớ rằng đó là một vấn đề trong ngày 9.3 và nó chắc chắn đang giết chết các kết nối trực tiếp vào ngày 10.1.
  2. Nếu bạn chưa cài đặt ArcSDE và nó chỉ chạy trên một máy chủ riêng biệt thì bạn có thể thực hiện lệnh này từ xa từ Python. Có một số cuộc thảo luận trong chủ đề này .

Có, tôi đang sử dụng SDE (được cài đặt trên máy chủ). Nhưng lệnh "sdemon -o kill" trả về lỗi cú pháp.
avrechi

Lệnh sdemon phải được thực thi trong ArcSDE. Tôi có thể đặt nó trên tập lệnh Python của mình không?
avrechi

1
Hãy xem mô-đun quy trình con . Ngoài ra còn có một câu hỏi hay ở đây: Cách gọi lệnh bên ngoài trong Pythonlệnh Chạy shell từ python và bắt đầu ra .
Alex Markov

2
Lệnh sdemon -o killlà không đủ. Bạn nên vượt qua các tham số bổ sung, hãy xem liên kết được cung cấp .
Alex Markov

2

Một khả năng khác vì bạn nói rằng bạn đang sử dụng SDE là xóa các khóa được chia sẻ khỏi các bảng layer_lockstable_locksbảng bằng SQL, PL / SQL, T-SQL, v.v.

DELETE FROM TABLE_LOCKS WHERE SDE_ID = :b1 AND REGISTRATION_ID = :b2

Tôi chắc chắn sẽ không đề xuất phương pháp này trên cơ sở dữ liệu địa lý phiên bản. Xem thêm: Các cơ chế khóa khác nhau được triển khai trong ArcSDE và cơ sở dữ liệu địa lý như thế nào?


2

Nếu ưu tiên là loại bỏ các khóa người dùng SDE cụ thể, có một cách để thực hiện điều này thông qua arcpy . Tôi thích cách tiếp cận này vì nó không yêu cầu bạn nhảy lên máy chủ cơ sở dữ liệu để thực hiện lệnh sde. Tôi có thể ngắt kết nối mọi khóa không mong muốn, sau đó thực hiện cập nhật dữ liệu tất cả trong một tập lệnh / tiến trình.

Ví dụ từ liên kết trên rất hữu ích:

import arcpy

admin_workspace = "Database Connections/tenone@sde.sde"
arcpy.env.workspace = admin_workspace
user_name = "GDB"

# Look through the users in the connected user list and get the SDE ID.
# Use the SDE ID to disconnect the user that matches the username variable
users = arcpy.ListUsers() # The environment is set, no workspace is needed.
for item in users:
    if item.Name == user_name:
        arcpy.DisconnectUser(admin_workspace, item.ID)

Tôi đã chạy nó và dường như hoạt động, cho đến khi nó đạt được phiên IDID hiện tại của tôi và đã gây ra lỗi. Có cách nào để lặp qua người dùng và bỏ qua người dùng hiện tại (if item.Name == 'DBO' và item.ID! = <ID phiên của người dùng hiện tại>)? Tôi không thể tìm cách tìm ID phiên của người dùng hiện tại.
m.Walker

0

Tôi không quen thuộc lắm với postgresql nhưng tôi nghĩ bài đăng này có thể đưa bạn đi đúng hướng:

/programming/5108876/kill-a-postgresql-session-connection

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.