create or replace synonym DBFIELD_DICT

本文介绍了Oracle数据库中遇到的ORA-00600和ORA-38729错误,并解释了如何创建同义词DBFIELD_DICT。此外,还详细说明了审计功能的参数audit_trail的不同设置选项及其对审计记录的影响。
ORA-00600: internal error code, arguments: [kccsbck_first], [1], [1225894314], [], [], [], [], [], [], [], [], []


create or replace synonym DBFIELD_DICT
for SYSDB66.DBFIELD_DICT;


一 审计功能的参数控制
audit_trail 参数的值可以设置为以下几种

1. NONE:不开启
2. DB:开启审计功能
3. OS:审计记录写入一个操作系统文件。
4. TRUE:与参数DB一样
5. FALSE:不开启审计功能。
这个参数是写道spfile里面的,需要重启数据库



ORA-38729
完整代码怎么修改,import contextlib import copy import functools import pprint import textwrap import typing import blinker # 新版本 blinker 中的等效调用 from blinker import saferef # 替代原 _saferef from seleniumwire.thirdparty.mitmproxy import exceptions from seleniumwire.thirdparty.mitmproxy.utils import typecheck """ The base implementation for Options. """ unset = object() class _Option: __slots__ = ("name", "typespec", "value", "_default", "choices", "help") def __init__( self, name: str, typespec: typing.Union[type, object], # object for Optional[x], which is not a type. default: typing.Any, help: str, choices: typing.Optional[typing.Sequence[str]] ) -> None: typecheck.check_option_type(name, default, typespec) self.name = name self.typespec = typespec self._default = default self.value = unset self.help = textwrap.dedent(help).strip().replace("\n", " ") self.choices = choices def __repr__(self): return "{value} [{type}]".format(value=self.current(), type=self.typespec) @property def default(self): return copy.deepcopy(self._default) def current(self) -> typing.Any: if self.value is unset: v = self.default else: v = self.value return copy.deepcopy(v) def set(self, value: typing.Any) -> None: typecheck.check_option_type(self.name, value, self.typespec) self.value = value def reset(self) -> None: self.value = unset def has_changed(self) -> bool: return self.current() != self.default def __eq__(self, other) -> bool: for i in self.__slots__: if getattr(self, i) != getattr(other, i): return False return True def __deepcopy__(self, _): o = _Option( self.name, self.typespec, self.default, self.help, self.choices ) if self.has_changed(): o.value = self.current() return o class OptManager: """ OptManager is the base class from which Options objects are derived. .changed is a blinker Signal that triggers whenever options are updated. If any handler in the chain raises an exceptions.OptionsError exception, all changes are rolled back, the exception is suppressed, and the .errored signal is notified. Optmanager always returns a deep copy of options to ensure that mutation doesn't change the option state inadvertently. """ def __init__(self): self.deferred: typing.Dict[str, str] = {} self.changed = blinker.Signal() self.errored = blinker.Signal() # Options must be the last attribute here - after that, we raise an # error for attribute assigment to unknown options. self._options: typing.Dict[str, typing.Any] = {} def add_option( self, name: str, typespec: typing.Union[type, object], default: typing.Any, help: str, choices: typing.Optional[typing.Sequence[str]] = None ) -> None: self._options[name] = _Option(name, typespec, default, help, choices) self.changed.send(self, updated={name}) @contextlib.contextmanager def rollback(self, updated, reraise=False): old = copy.deepcopy(self._options) try: yield except exceptions.OptionsError as e: # Notify error handlers self.errored.send(self, exc=e) # Rollback self.__dict__["_options"] = old self.changed.send(self, updated=updated) if reraise: raise e def subscribe(self, func, opts): """ Subscribe a callable to the .changed signal, but only for a specified list of options. The callable should accept arguments (options, updated), and may raise an OptionsError. The event will automatically be unsubscribed if the callable goes out of scope. """ for i in opts: if i not in self._options: raise exceptions.OptionsError("No such option: %s" % i) # We reuse blinker's safe reference functionality to cope with weakrefs # to bound methods. func = blinker._saferef.safe_ref(func) @functools.wraps(func) def _call(options, updated): if updated.intersection(set(opts)): f = func() if f: f(options, updated) else: self.changed.disconnect(_call) # Our wrapper function goes out of scope immediately, so we have to set # weakrefs to false. This means we need to keep our own weakref, and # clean up the hook when it's gone. self.changed.connect(_call, weak=False) def __eq__(self, other): if isinstance(other, OptManager): return self._options == other._options return False def __deepcopy__(self, memodict = None): o = OptManager() o.__dict__["_options"] = copy.deepcopy(self._options, memodict) return o __copy__ = __deepcopy__ def __getattr__(self, attr): if attr in self._options: return self._options[attr].current() else: raise AttributeError("No such option: %s" % attr) def __setattr__(self, attr, value): # This is slightly tricky. We allow attributes to be set on the instance # until we have an _options attribute. After that, assignment is sent to # the update function, and will raise an error for unknown options. opts = self.__dict__.get("_options") if not opts: super().__setattr__(attr, value) else: self.update(**{attr: value}) def keys(self): return set(self._options.keys()) def items(self): return self._options.items() def __contains__(self, k): return k in self._options def reset(self): """ Restore defaults for all options. """ for o in self._options.values(): o.reset() self.changed.send(self, updated=set(self._options.keys())) def update_known(self, **kwargs): """ Update and set all known options from kwargs. Returns a dictionary of unknown options. """ known, unknown = {}, {} for k, v in kwargs.items(): if k in self._options: known[k] = v else: unknown[k] = v updated = set(known.keys()) if updated: with self.rollback(updated, reraise=True): for k, v in known.items(): self._options[k].set(v) self.changed.send(self, updated=updated) return unknown def update_defer(self, **kwargs): unknown = self.update_known(**kwargs) self.deferred.update(unknown) def update(self, **kwargs): u = self.update_known(**kwargs) if u: raise KeyError("Unknown options: %s" % ", ".join(u.keys())) def setter(self, attr): """ Generate a setter for a given attribute. This returns a callable taking a single argument. """ if attr not in self._options: raise KeyError("No such option: %s" % attr) def setter(x): setattr(self, attr, x) return setter def toggler(self, attr): """ Generate a toggler for a boolean attribute. This returns a callable that takes no arguments. """ if attr not in self._options: raise KeyError("No such option: %s" % attr) o = self._options[attr] if o.typespec != bool: raise ValueError("Toggler can only be used with boolean options") def toggle(): setattr(self, attr, not getattr(self, attr)) return toggle def default(self, option: str) -> typing.Any: return self._options[option].default def has_changed(self, option): """ Has the option changed from the default? """ return self._options[option].has_changed() def merge(self, opts): """ Merge a dict of options into this object. Options that have None value are ignored. Lists and tuples are appended to the current option value. """ toset = {} for k, v in opts.items(): if v is not None: if isinstance(v, (list, tuple)): toset[k] = getattr(self, k) + v else: toset[k] = v self.update(**toset) def __repr__(self): options = pprint.pformat(self._options, indent=4).strip(" {}") if "\n" in options: options = "\n " + options + "\n" return "{mod}.{cls}({{{options}}})".format( mod=type(self).__module__, cls=type(self).__name__, options=options ) def set(self, *spec, defer=False): """ Takes a list of set specification in standard form (option=value). Options that are known are updated immediately. If defer is true, options that are not known are deferred, and will be set once they are added. """ vals = {} unknown = {} for i in spec: parts = i.split("=", maxsplit=1) if len(parts) == 1: optname, optval = parts[0], None else: optname, optval = parts[0], parts[1] if optname in self._options: vals[optname] = self.parse_setval(self._options[optname], optval) else: unknown[optname] = optval if defer: self.deferred.update(unknown) elif unknown: raise exceptions.OptionsError("Unknown options: %s" % ", ".join(unknown.keys())) self.update(**vals) def process_deferred(self): """ Processes options that were deferred in previous calls to set, and have since been added. """ update = {} for optname, optval in self.deferred.items(): if optname in self._options: optval = self.parse_setval(self._options[optname], optval) update[optname] = optval self.update(**update) for k in update.keys(): del self.deferred[k] def parse_setval(self, o: _Option, optstr: typing.Optional[str]) -> typing.Any: """ Convert a string to a value appropriate for the option type. """ if o.typespec in (str, typing.Optional[str]): return optstr elif o.typespec in (int, typing.Optional[int]): if optstr: try: return int(optstr) except ValueError: raise exceptions.OptionsError("Not an integer: %s" % optstr) elif o.typespec == int: raise exceptions.OptionsError("Option is required: %s" % o.name) else: return None elif o.typespec == bool: if optstr == "toggle": return not o.current() if not optstr or optstr == "true": return True elif optstr == "false": return False else: raise exceptions.OptionsError( "Boolean must be \"true\", \"false\", or have the value " "omitted (a synonym for \"true\")." ) elif o.typespec == typing.Sequence[str]: if not optstr: return [] else: return getattr(self, o.name) + [optstr] raise NotImplementedError("Unsupported option type: %s", o.typespec) def make_parser(self, parser, optname, metavar=None, short=None): """ Auto-Create a command-line parser entry for a named option. If the option does not exist, it is ignored. """ if optname not in self._options: return o = self._options[optname] def mkf(l, s): l = l.replace("_", "-") f = ["--%s" % l] if s: f.append("-" + s) return f flags = mkf(optname, short) if o.typespec == bool: g = parser.add_mutually_exclusive_group(required=False) onf = mkf(optname, None) offf = mkf("no-" + optname, None) # The short option for a bool goes to whatever is NOT the default if short: if o.default: offf = mkf("no-" + optname, short) else: onf = mkf(optname, short) g.add_argument( *offf, action="store_false", dest=optname, ) g.add_argument( *onf, action="store_true", dest=optname, help=o.help ) parser.set_defaults(**{optname: None}) elif o.typespec in (int, typing.Optional[int]): parser.add_argument( *flags, action="store", type=int, dest=optname, help=o.help, metavar=metavar, ) elif o.typespec in (str, typing.Optional[str]): parser.add_argument( *flags, action="store", type=str, dest=optname, help=o.help, metavar=metavar, choices=o.choices ) elif o.typespec == typing.Sequence[str]: parser.add_argument( *flags, action="append", type=str, dest=optname, help=o.help + " May be passed multiple times.", metavar=metavar, choices=o.choices, ) else: raise ValueError("Unsupported option type: %s", o.typespec) def dump_dicts(opts, keys: typing.List[str]=None): """ Dumps the options into a list of dict object. Return: A list like: { "anticache": { type: "bool", default: false, value: true, help: "help text"} } """ options_dict = {} keys = keys if keys else opts.keys() for k in sorted(keys): o = opts._options[k] t = typecheck.typespec_to_str(o.typespec) option = { 'type': t, 'default': o.default, 'value': o.current(), 'help': o.help, 'choices': o.choices } options_dict[k] = option return options_dict
最新发布
08-19
### Oracle 中 `CREATE OR REPLACE SYNONYM` 语句的作用和用法 #### 1. 创建同义词的基本概念 在 Oracle 数据库中,`CREATE SYNONYM` 语句用于创建一个同义词(Synonym),即为数据库对象(如表、视图、序列、存储过程等)提供一个替代名称。同义词的主要作用是简化复杂对象的访问路径,并减少对模式名称的依赖[^1]。 #### 2. `CREATE OR REPLACE SYNONYM` 的语法 以下是 `CREATE OR REPLACE SYNONYM` 的标准语法: ```sql CREATE [OR REPLACE] [PUBLIC] SYNONYM synonym_name FOR object_name[@db_link]; ``` - `OR REPLACE`:如果同义词已存在,则替换它而不抛出错误。 - `PUBLIC`:表示创建的是公共同义词,所有用户都可以访问。如果不指定,则默认为私有同义词,仅限于创建它的用户或具有适当权限的用户访问。 - `synonym_name`:同义词的名称。 - `object_name`:目标对象的名称(可以是表、视图、序列等)。 - `@db_link`:可选参数,用于跨数据库链接的对象。 #### 3. 在 `tp_policy_opr.T_E_base_CARRIER_COVERAGE` 和 `auto_opr.T_E_base_CARRIER_COVERAGE` 上的应用 假设存在两个不同的模式(Schema),分别是 `tp_policy_opr` 和 `auto_opr`,它们各自包含名为 `T_E_base_CARRIER_COVERAGE` 的表或视图。为了方便不同用户或应用程序访问这些对象,可以分别为它们创建同义词。 以下是一个示例: ```sql -- 创建指向 tp_policy_opr 模式下 T_E_base_CARRIER_COVERAGE 表的私有同义词 CREATE OR REPLACE SYNONYM policy_coverage FOR tp_policy_opr.T_E_base_CARRIER_COVERAGE; -- 创建指向 auto_opr 模式下 T_E_base_CARRIER_COVERAGE 表的私有同义词 CREATE OR REPLACE SYNONYM auto_coverage FOR auto_opr.T_E_base_CARRIER_COVERAGE; ``` 通过上述操作: - 用户可以直接使用 `policy_coverage` 来访问 `tp_policy_opr.T_E_base_CARRIER_COVERAGE`。 - 用户可以直接使用 `auto_coverage` 来访问 `auto_opr.T_E_base_CARRIER_COVERAGE`。 #### 4. 公共同义词的应用 如果希望所有用户都能访问某个对象,可以创建公共同义词。例如: ```sql -- 创建公共同义词,指向 tp_policy_opr 模式下的 T_E_base_CARRIER_COVERAGE 表 CREATE OR REPLACE PUBLIC SYNONYM public_policy_coverage FOR tp_policy_opr.T_E_base_CARRIER_COVERAGE; ``` 此时,任何具有适当权限的用户都可以通过 `public_policy_coverage` 访问该对象。 #### 5. 同义词的优势 - **简化访问**:用户无需记住复杂的对象路径或模式名称。 - **提高灵活性**:可以在不更改应用程序代码的情况下更改底层对象的位置或名称。 - **增强安全性**:通过控制同义词的访问权限,可以限制对某些对象的直接访问。 #### 6. 注意事项 - 如果删除了同义词所指向的对象,同义词将变为无效状态。 - 删除同义词不会影响其指向的对象。 - 公共同义词需要谨慎管理,因为它们会影响整个数据库的命名空间。 ### 示例代码 以下是一个完整的示例,展示如何创建和使用同义词: ```sql -- 假设存在两个表 CREATE TABLE tp_policy_opr.T_E_base_CARRIER_COVERAGE (id NUMBER, name VARCHAR2(100)); CREATE TABLE auto_opr.T_E_base_CARRIER_COVERAGE (id NUMBER, name VARCHAR2(100)); -- 创建私有同义词 CREATE OR REPLACE SYNONYM policy_coverage FOR tp_policy_opr.T_E_base_CARRIER_COVERAGE; CREATE OR REPLACE SYNONYM auto_coverage FOR auto_opr.T_E_base_CARRIER_COVERAGE; -- 使用同义词插入数据 INSERT INTO policy_coverage (id, name) VALUES (1, 'Policy Coverage'); INSERT INTO auto_coverage (id, name) VALUES (1, 'Auto Coverage'); -- 查询数据 SELECT * FROM policy_coverage; SELECT * FROM auto_coverage; ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值