【问题标题】:Oracle SQL Delete Record without affecting child tablesOracle SQL 删除记录而不影响子表
【发布时间】:2017-01-21 13:39:20
【问题描述】:

我的数据库中有很多表,但我的问题与这两个表有关:

.

它们的定义是:

Employee (EmployeeID_PK, FirstName, LastName, Email, ...)
Order    (OrderID_PK, EmployeeID_FK, OrderDate, MenuID, ...)

*_PK = Primary Key
*_FK = Foreign Key

现在我想删除一个员工,这样他就不能再登录了,但我仍然需要他的订单和他的属性(如名字、姓氏……)。

所以数据应该保留在表格中,但员工应该不能再登录了。

我知道向 Employee 添加一个“isactive”列是一种解决方案,但我认为这不是最好的方法。无论如何,请告诉我,如果这是唯一的方法。

提前致谢!

【问题讨论】:

  • 如何防止用户登录与数据库中表的内容有任何关联?锁定用户帐户与表中的行无关。

标签: sql-delete delete-row oracle12c


【解决方案1】:

这种情况不应通过修改现有表(例如,向表中添加列等)来解决。

相反,这正是“锁定用户帐户”的用途。您可以锁定用户的帐户,因此她或他无法再登录,但她或他的架构(即她或他的所有对象,例如表、索引、视图等)保持原样。

https://docs.oracle.com/database/121/ADMQS/GUID-6A8D4A59-6DB2-4662-BA4C-05B914D31B4F.htm#ADMQS12042

https://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_4003.htm#SQLRF01103

【讨论】:

    【解决方案2】:

    正如您所说,一种选择是有一个 status 列 - 1 表示活动,0 表示不活动,2 表示登录被阻止。

    如果您不想采用这种方法,您可以创建主表和辅助表的副本(Employee_ArchiveOrder_Archive 具有等效的 pk 和 fk 约束)并将这两个数据集移动到那里。这样用户就无法再登录,不会丢失任何数据并保持完整性。

    但是,如果 Order 表中的数据过多,您可能仍然只剩下第一种方法 - 添加 status 列。

    【讨论】:

    • 那么,你的意思是如果我想删除一个员工,让他不能再登录,我只删除active_employees表中的记录?
    • 相信如果存在 fk-constraint,您将无法删除 active-employees 中的任何条目。因此,您还需要将订单移动到存档表中。那就是不要删除,移动数据。而且,当您移动员工时,由于 fk 约束,您可能还必须移动订单数据。这就是为什么我说添加一个状态列并修改应用程序实现以查找状态是一个更好的主意。
    • 好的,感谢您的快速答复。我也尝试了“第二表方法”,但我认为现在添加 isactive 列是更好的方法。谢谢:)
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-11
    • 2023-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多